vulnhub-Symfonos5

下載地址:https://www.vulnhub.com/entry/symfonos-5,415/

前言:

文中提到的工具和漏洞僅供學習。此文較長看起來有點費時間,並且靶機做起來的時候思維有點混亂,所以也寫得不是很有邏輯性。作爲小白(省略)

Kali:192.168.109.129

目標機:192.168.109.142

端口掃描:

TCP:

漏洞挖掘:

從掃描信息來看,先訪問80端口。

一般這種情況是選擇查看頁面源碼和爆破目錄。查看頁面源碼:

頁面源碼沒有任何提示。爆破目錄即可,也可以盲猜robots.txt(這裏確實不存在robots.txt文件)。

發現admin.php,先訪問一下static文件夾。先訪問static文件夾,沒有任何提示,只有幾張圖片,可以下載下來,看看是否藏着東西,查看後沒有任何發現,跳過該目錄。

訪問admin.php,發現一個登錄窗口。

對於登錄框,先考慮一下admin等弱密碼,但是沒有結果,且底部有正誤判斷。

結合nmap的掃描信息,出現ldap服務,它是輕量級目錄訪問協議,用於在目錄的資源中搜索和查詢,類似理解爲數據庫。既然需要查詢,就有它自己的查詢語句,就像關係型數據庫有sql語句來查詢,此時就想到了sql注入,對於登錄框,也許也存在類似於sql注入的漏洞。於是特意查了一下是否存在ldap的注入,也確實存在這樣的注入漏洞。

此處斷開,簡(我)單(也)介(只)紹(會)一(這)下(些)ldap注入漏洞,內容不一定正確,都是我自己的理解:

既然類似於sql注入,學會sql注入,就要先了解sql語句。學習ldap注入漏洞,就要學會其基本語法。

先介紹基本語法:

“()”:語句的起始,例如(attribute=value)。

“=”:某個屬性等於某個值,查找姓名爲a的對象,可寫爲(name=a)

“&”:與,查找符合所有過濾條件(語句)的對象。

“!”:非,查找都不符合過濾條件(語句)的對象。

“|”:或,查找至少符合一個過濾條件(語句)的對象。

“*”:通配符,無論屬性值是什麼,全部匹配(這個趕覺很有用)。

“>=”:大於等於。

“<=”:小於等於。

最後舉幾個例子:

查詢賬號是admin且密碼是password的對象:(&(account=admin)(passwd=password))

查詢賬號是admin或密碼是password的對象:(|(account=admin)(passwd=password))

查詢賬號不是admin的對象:(!(account=admin))

接下來就是漏洞的產生原理:

和sql注入相似,就是讓用戶輸入構成查詢語句,查詢我們想要的東西,對於用戶的輸入,程序沒有進行很好的過濾,導致用戶可以輸入惡意語句以構造查詢語句,以此進行惡意活動。

利用方法(針對openldap):

利用方法也和sql注入相似,唯一區別是它沒有註釋符。利用該漏洞就是加入字符,閉合語句,比如(&(account=admin)(passwd=password)),攻擊語句對account點進行注入,輸入爲admin)(attack),此時結合成的語句就是(&(account=admin)(attack))(passwd=password)),這句 語句是不對的,但是還是會從左往右執行,並且忽略掉(passwd=password))這個語句。

檢測辦法:看回顯,無論是報錯回顯還是正確回顯。

注入類型:有回顯和盲注。

因爲沒有現成的靶場,所以具體盲注和有回顯注入也只能遇到了就自己體會吧。看到了其他好多博客,只能總結出幾個語句,沒有實圖,有的可能會在該靶場用到。

有回顯型:

And注入,查詢語句:(&(account=admin)(passwd=password)),注入語句admin)(&),形成(&(account=admin)(&))(passwd=password)),此時形成登錄萬能鑰匙,前提是用戶名得真實存在。

Or注入,查詢語句:(|(account=admin)(passwd=password)),注入語句可爲admin)(uid=*),形成(|(account=admin)(uid=*))(passwd=password)),此時應該可以查出所有的用戶(別問,上面說過了)。

盲注(常用通配符*),利用方法和上面差不多:

And盲注:查詢語句:(&(account=admin)(passwd=password)),注入語句*)(account=*),形成(&(account=*)(account=*))(passwd=password))。

Or盲注:查詢語句:(|(account=admin)(passwd=password)),注入語句可爲admin)(uid=1*),形成(|(account=admin)(uid=1*))(passwd=password))。

通配符可以用於猜解信息。對於這個漏洞。總之就是閉合就對了。

注:經過我在該靶機上的多次實踐後發現,無論用萬能鑰匙怎麼登錄,都是失敗。終於再次閱讀了一些博客後,終於找到了一個解決辦法,就是在注入語句後加入%00截斷。也許這個靶機的openldap檢查了語義,語義不正確則不讓放行。當然萬能密碼前提是不變,那就是前提是用戶名得正確。

漏洞介紹到此結束。

接下來回到靶機。針對這個登錄頁面,只能說猜測可能存在ldap注入漏洞,於是我嘗試了一下萬能鑰匙。

但是,突然想起,這個萬能鑰匙要確保用戶名正確啊,用戶名去哪弄呢,突然想到通配符,但是萬能鑰匙登不進去。也不確定人家是不是ldap注入漏洞。會不會是sql注入。於是又試了試sql注入的萬能鑰匙admin’ or 1=1#,但是也沒有反映。此時陷入沉思。之前只是簡單爆破了一下目錄文件,現在可以動用目錄字典爆破一下。使用dirb自帶的big.txt爆破目錄。

都訪問一遍看看。portraits.php。

home.php沒有任何反映,直接回到登錄框。使用bp抓包看看。最終在home.php響應包裏面發現了一個url網址。

該url參數可能存在一個本地文件包含漏洞,也可能存在遠程文件包含漏洞,也可能存在ssrf漏洞。因爲此處是單靶機,就算有內網也不知道ip,所以可以忽略掉這個漏洞。先看看是否存在遠程文件包含漏洞。下面這個文件夾有幾張圖片,在該文件夾開啓簡單服務器,訪問該文件,看是否被訪問。

確切的說是可以包含的,但是不執行,是個假文件包含漏洞。

那看看是否可以包含本地文件/etc/passwd。

據此可以包含好多文件啊,先看看剛剛的登錄頁面的代碼吧。

上圖是admin.php的主要代碼,確實是ldap服務,並且也確實存在ldap注入漏洞,也知道了連接密碼。最直接的辦法就是直接包含木馬,可以看看home.php的代碼。

確實不能執行。只能從ldap服務下手,先嚐試遠程連接,主要是看到了代碼中ip居然和現在不對,感覺是不是又存在內網,這個可以先放一放。那就直接在ldap注入上下手吧。注入雖然不知道用戶名,但是可以通配符啊。一下爲url。

先嚐試登錄上去看看,使用永真條件。

登錄成功:

成功後發現這是home.php,突然想起之前的文件包含漏洞,但是作爲ctf,應該包含哪個文件呢,有些不知所措。我不禁懷疑,難道作者是想讓我萬能密碼登錄,然後根據文件包含漏洞來包含有用文件,然後從ssh登錄靶機,然後提權?說的好,先試試包含幾個文件吧。Passwd之前是包含過了,其他敏感文件包含不出來,沒啥用。看樣子還是要從注入下手。猜解用戶名和密碼,就目前條件來看只能做這個。猜解辦法就是配合通配符,使用萬能鑰匙,看是否可以登錄成功。先猜用戶名的首字母,ascii碼錶中的字符全來一遍,第二個字母一樣,這種情況當時是寫腳本啦。例子如下:

登錄失敗,沒有反應。突然想到26個字母,我靠。挑個z試試。

登錄成功,說明至少有一個用戶名首字母是z(爆破用戶名和密碼是想看看獲取的登錄密碼會不會是ssh的登錄密碼,這個思路之前也講過,在包含/etc/passwd文件的時候,我也很奇怪,爲什麼裏面沒有z開頭的用戶,但還是想試試)。但是,千萬別用上面的思想寫腳本。因爲之前的文件包含漏洞發現了ldap的用戶名和連接密碼,並且端口可以掃描出來,一定可以遠程連接,遠程連接後,嘗試讀取內部內容,可以寫個腳本,也可以採用客戶端連接。

此處簡單說一下kali如何安裝Python-ldap:

首先先pip install python-ldap。會報錯,不存在lber.h。

執行apt-get install -y libldap2-dev。再次pip install python-ldap,報錯,不存在sasl.h。

執行apt-get install -y liblsasl2-dev。再次pip install python-ldap。一切正常。

最後給一個官方的教程網址:https://www.python-ldap.org/en/python-ldap-3.2.0/installing.html#build-prerequisites。裏面有需要的所有依賴。

導入成功:

到此介紹結束。

繼續回到寫腳本的地方。腳本如下,連接上後,查詢用戶 信息,獲取用戶名和密碼信息(裏面也包含很多其他信息,比如郵件地址等,此處只需要賬戶):

接下來嘗試ssh登錄。連接成功:

提權:

因爲知道密碼,所以採用sudo -l的方式提權。因爲採取的ssh登錄,相當於已經使用了一次密碼,所以此時sudo -l不需要再次使用密碼。

從內容看以root執行dpkg不需要密碼。該命令是用來安裝、刪除、管理和構建軟件包的。此時以root權限。我第一反應是可以安裝一個存在越權漏洞的軟件,比如nmap2.02到5.12版本,但是事情應該沒有那麼簡單,因爲可能安裝上來不讓運行。並且在該用戶目錄下發現了兩個可以文件:

也許是利用它來提取。dpkg可以安裝這兩個文件,先安裝試試。安裝完後沒有變化。

突然想到,既然是可以安裝deb包,那能不能構造一個deb包實現提權呢,提權其實是調用root的bash,在這裏sudo以root用戶去執行,那麼就可以調用他的root的bash,只是是否可以在deb包中使用命令,所以去了解一下deb包。

此處簡單介紹一下啊deb包結構:

deb包基本結構:

control文件(必須存在):描述包的基本信息,字段有:

    Package:包名稱(不能有空格);

    Version:版本;

    Description:軟件的描述

    Section:軟件類別描述,如text,mail

    Priority:對系統的重要程度,有required,standard,optional,extra;

    Depends:軟件需要的依賴;

    Suggests:建議安裝的其他依賴;

    Architecture:所支持的平臺,有i386,amd64,m68k等;

    Essential:是否爲系統基本包,取值有yes/no,yes則不允許卸載;

    Source:軟件包的源代碼名稱;

    Pre-Depends:安裝前,必須安裝的依賴、軟件等;

    Recommends:推薦安裝的其他軟件包和庫文件。

    Maintrainer:打包者名稱

perinst文件:軟件安裝前需運行的shell腳本。

postinst文件:軟件安裝後需要運行的shell腳本。

perrm文件:軟件刪除前需要執行的shell腳本。

postrm文件:軟件刪除後需要執行的shell腳本。

注:shell腳本中,必須以#!/bin/sh開頭。

製作簡易deb包:

先創建一個總文件夾,名稱爲shell,創建DEBIAN文件夾(必須大寫),在DEBIAN文件夾下創建control和幾個可執行文件,比如創建一個postinst。在shell文件夾下創建軟件安裝路徑信息,比如創建/tmp,意思是安裝到tmp文件夾。

執行dpkg -b shell shell.deb即可。

到此介紹結束。

編寫control文件,內容如下:

寫入shell進postinst文件,調用bash,內容如下(記得賦權):

打包:

上傳腳本到靶機(圖略)。執行,提權成功。

獲取flag

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章