之前公众号刚申请的时候就写了一篇文章,是一个关于远程浇花的想法,想了很久都没去实现,最近端午放假就做了一下,程序可能有很多漏洞?大佬们手下留情。先上视频:
来看一下整个系统的接线图,主要就是ESP8266和继电器的连接。
接下来看看原理图,本来想使用MQTT协议,无奈太菜只好用python起个flask,然后使用ESP的HTTP模块请求云服务监测是否有任务需要执行。
具体的代码如下:
ESP8266芯片<init.lua>文件代码:
代码语言:javascript复制light = 4
flowerControlPin = 1
gpio.mode(light,gpio.OUTPUT)
gpio.mode(flowerControlPin,gpio.OUTPUT)
--Flower Timer (close Flower control Pin)
FlowerTimer = tmr.create()
FlowerTimer:alarm(5000,tmr.ALARM_SEMI,function()
gpio.write(light,gpio.HIGH)
gpio.write(flowerControlPin,gpio.LOW)
print("stop.....")
end)
FlowerTimer:stop()
-- main
function main()
dofile("server.lua")
end
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(AcquiredInfo)
------------------------------------------------------------
print("nSTA - GOT IP".."nStation IP: "..AcquiredInfo.IP..
"nSubnet mask: "..AcquiredInfo.netmask..
"nGateway IP: "..AcquiredInfo.gateway)
main()
------------------------------------------------------------
end)
dofile("wificfg.lua") -- waiting WiFi connect
ESP8266芯片<wificfg.lua>文件代码:
代码语言:javascript复制----------------------------------
--[[WIFI config SSID PASSWORD]]--
wifi.setmode(wifi.STATION)
wifi.sta.config({ssid="ssid",pwd="mimamima"})
wifi.sta.connect()
ESP8266芯片<server.lua>文件代码:
代码语言:javascript复制----------------------------------
--[[ HTTP server config page ]]--
joburl = "http://1.1.1.1:8000/getjob"
function getjob(code,data)
if (code < 0) then
print("HTTP request failed")
else
if (data=="watertheflower") then
gpio.write(light,gpio.LOW)
gpio.write(flowerControlPin,gpio.HIGH)
FlowerTimer:start()
print("start.....")
else
print(data)
end
end
end
function doJob()
print("Hi I am runing")
http.get(joburl, nil, getjob)
end
JobTimer = tmr.create()
JobTimer:alarm(2000,tmr.ALARM_AUTO,doJob)
JobTimer:stop()
JobTimer:start()
服务器端python代码:
代码语言:javascript复制from flask import Flask
import time
app = Flask(__name__)
task = False
lastwatertheflower = 0
authentication = "asdf1234"
def setTask():
global task
global lastwatertheflower
lastwatertheflower = int(time.time())
if task == False:
task = True
def undoTask():
global task
if task == True:
task = False
@app.route('/assigntask/<password>')
def assigntask(password):
if password != authentication:
return "faild"
now = int(time.time())
if now-lastwatertheflower > 3600:
setTask()
data = 'success'
else:
data = "faild"
return data
@app.route('/getjob')
def getjob():
if task:
undoTask()
return 'watertheflower'
else:
return 'nothing'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
iPhone快捷指令:
代码总共加起来都没到200行,本来想使用AES加密一下时间戳和指令,但是无奈找不到iPhone快捷执行的JSBox怎么用?。
当然也可以使用server酱的TalkAdmin来控制,直接将web地址填入WebHook即可
仅供给大家提供一个好玩的思路,在这个远程浇花的系统中可能存在漏洞点如下:
1.客户端-服务器明文传输,可能导致重放攻击、密钥泄漏
2.服务器-终端设备明文传输,可能导致重放攻击、任意用户控制终端设备(是说其他人可以随便给我浇花么?)
欢迎找到其他漏洞的小伙伴在下方留言哇!