記一次廠商的滲透之旅

前記

    最近拿到了一個比較有意思的站點,所以就想着寫一篇博客分享一下滲透思路,文內的一些廠商信息我已經打上了碼,但是相信還是會有眼尖的小夥伴。關於上傳的一些木馬文件在測試後我也會刪除,目前漏洞已經提交,所以大家可以放心閱讀。

初見站點

    首先,在我們已經確定了目標站點的時候,需要做的第一步自然就是信息收集,這在整個滲透過程中,十分重要。
在這裏插入圖片描述
以上就是我們本次的目標站點,一般來講,對於一些較大的廠商的,主站通常不會有漏洞。所以我們可以從旁站入手,通過子域名以及ip反查等手段進行收集信息。
在這裏插入圖片描述
通過子域名查詢,我們可以看到一共有16個子域名,箭頭所指就是我們本次發現漏洞的站點了,下面我們去訪問這個站點。
在這裏插入圖片描述
發現是一個管理系統,但是隻是隻是連接的一些其他子域名的系統管理。嘗試註冊賬號,發現也並不是開放式註冊。
在這裏插入圖片描述
所以繼續把焦點放到剛纔那個站點,嘗試對其進行端口主機掃描。對於獲取其ip信息的方法也比較簡單,可以直接ping,沒有發現CDN,並且可以直接通過ip訪問站點。
在這裏插入圖片描述

發現漏洞

    現在我們對目標站點嘗試掃描端口服務及主機信息。
在這裏插入圖片描述
通過上述掃描我們可知,他們安了很多http服務和tomcat服務,事實上在後面的滲透裏越發能感受到,他網站搭建的給人一種混亂的感覺。通過對以上端口的逐個訪問,我們發現在5000端口上可以進行任意文件訪問。
在這裏插入圖片描述
通過翻閱這些文件,我們不難發現這個站點仍然有人在維護更新。也找到了一些比較有意思的東西。
在這裏插入圖片描述
例如這樣一個任意路徑文件上傳,沒有過濾手段。
在這裏插入圖片描述
亦或是這樣一個任意SQL語句執行的接口,不得不說,維護人員在給給自己提供便利的同時也給了攻擊者提供了大便利。

順藤摸瓜

    通過對上述文件任意查看處,我們獲得了一個很有意思的情報。
在這裏插入圖片描述
可以看到一個名爲測試的文件中記錄着一處上傳點是在7766端口上的。問我爲什麼下面那個沒打碼?那是它內網的ip,知道了也訪問不到哈哈,說到這一把淚不爭氣的流了出來,我們繼續往下看。
在這裏插入圖片描述
果然又是一個無過濾上傳點,這裏我們上傳了一個asp的大馬(測完就刪了)。
在這裏插入圖片描述
看到他的這些目錄名,我還是想吐槽一句,站搭的亂,名起的也亂。
在這裏插入圖片描述
這裏我們發現他的站點用戶是admin?但是奇怪的是我們在後續的滲透中沒有辦法執行系統命令。顯示的是存取被拒,估計應該是需要管理員權限纔可以。在這裏插入圖片描述
在測試過程中有一個坑,我不知道是個例還是普遍,我使用菜刀沒有辦法連接一句話木馬,但是使用蟻劍卻連接成功了,這也讓我走了一段彎路。當然,我嘗試上傳msfvenom生成的木馬想要拿到meterpreter進行內網滲透,但是上傳的asp文件顯示的是http 500,我想可能是維護人員禁用了某些函數?比如execute我嘗試確實不能正常使用。

峯迴路轉

    當測到上面的時候本來以爲沒有希望了,但是靈機一動,我們想起了5000端口那裏不也有一個任意上傳點嗎?於是我們就去嘗試一下。
在這裏插入圖片描述
然後我們發現已經成功上傳了。
在這裏插入圖片描述
使用蟻劍嘗試連接,這裏我們獲取到的是D盤的服務器,所以我們可以查看D盤了,上面的上傳點獲取的shell是C盤的。
在這裏插入圖片描述
這裏想到之前有一處任意SQL查詢的接口,於是我們去看一下那個文件代碼。
在這裏插入圖片描述
箭頭處我們得到信息,數據庫的用戶名爲pdaadmin,密碼爲pa180330,前面的ip告訴我們SQL Server並不在本地服務器,本地服務器的內網ip是172.27.0.10。
在這裏插入圖片描述
通過蟻劍的數據庫連接模塊,我們用剛纔lzx.asp文件獲取到的代碼進行連接,成功連接到目標數據庫。繼續審計我們又得到了一個數據庫用戶,在滲透時發現有一些數據庫我們是無權訪問的,因爲分配了多個數據庫用戶,但是隨着我們獲得數據庫用戶增加,對於數據庫的控制權也會增加。
在這裏插入圖片描述
繼續審計服務器內一些網站源碼,我們發現服務器內包含了許多其他站點的源碼通過對比數據庫我們得到了這些站點的用戶信息(如下圖)
在這裏插入圖片描述
其中也包含了企業內的信息,這我就不看了。繼續向下進行提權操作。
在這裏插入圖片描述
這裏同樣驚喜的發現,我們可以執行系統命令了,通過上圖創建用戶並提權,這裏創建的用戶已經提升至administrator組中了。
在這裏插入圖片描述
繼續上傳一個pr.exe提權工具,發現提升到system了。哈哈有360安全衛士,我說怎麼3389端口轉發了也沒法連接。
在這裏插入圖片描述
如下圖所示,存在域。
在這裏插入圖片描述
關於滲透域控的操作會放到下面來講,我們繼續往下看。

迷惑行爲

    沒錯下面這個就是那個名字起得很亂的目錄,我把他打包下來了。下面我們審計一下代碼看看有沒有漏洞吧。
在這裏插入圖片描述

我把代碼直接貼出來吧。

<%
'-------------------------------------------------------------------------------
'本文件是NLS-PT-850遠程數據傳輸和查詢的asp演示腳本程序,其功能爲接收NLS-PT-850
'發起的URL請求,並作出相應的處理。實際應用中,可以修改本文件,或把本文件
'嵌入到其他文件中,以實現更加複雜的功能。
'
'運行本演示程序之前,需在數據庫中建立一名爲"temp"的表,共3個字段。
'	字段1:
'		名稱:id
'		類型:INT, 自動編號
'	字段2'		名稱:data
'		類型:String 或 Memo, 存放條碼數據
'	字段3:
'		名稱:dt
'		類型:Date, 存放服務器接收到數據的時間
'-------------------------------------------------------------------------------
tmpdbFile = Server.MapPath("temp.mdb")

Set objFSO = Server.CreateObject("Scripting.FileSystemObject") '先查看數據庫是否存在
If not objFSO.FileExists(tmpdbFile) Then
	Set cat=server.CreateObject("ADOX.Catalog")
	cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tmpdbFile '不存在先創建數據庫
	Set cat=nothing
	
	Set conn=Server.CreateObject("ADODB.Connection")
	connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tmpdbFile
	conn.Open connstr
	
	sqlstr = "create table temp (id int IDENTITY(1,1),data String,dt date default Date()+time() )"
	conn.execute(sqlstr)
	conn.close
	set conn = nothing
End If

Set conn=Server.CreateObject("ADODB.Connection")

'創建SQL SERVER數據庫連接。這個連接串需要根據具體的服務器環境做相應修改。
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tmpdbFile
conn.Open connstr

'開始處理客戶端提交的數據
action = request("action")
outstr = ""

'區分客戶端欲完成的動作
select case action
	case "insert"	'插入動作

		data = request("data")	'獲得客戶端傳送的data參數值
		'--------------------------------------------------------------
		' 採集器送上來的數據用","隔開,如:
		'	tmp.asp?action=insert&data=11111111,222222,333333,444444,55555
		'--------------------------------------------------------------
		schar = ","
		
		'根據客戶端傳送參數值的個數(1個或多個),循環獲取參數
		Do
			if instr(data,schar) > 0 then	'參數數量大於1
				pos = instr(data,schar)
				ins = mid(data,1,pos-1)
				if ins = "" then
				else
					sqlstr = "insert into temp (data) values ('" & ins & " ')"
					conn.execute(sqlstr)	'執行sql語句
					data = mid(data,pos+1)
				end if
			else	'參數數量等於1
				if data = "" then
				else
					sqlstr = "insert into temp (data) values ('" & data & " ')"
					conn.execute(sqlstr)
				end if
				Exit Do
			end if
		Loop
		response.write "<RAW name=resp>OK</RAW>"	'返回成功信息
		
		
	case "query"	'查詢動作
		'------------------------------------------------------------------
		'根據客戶端傳送參數值的個數構造不同的sql語句
		'參數例子:
		'	tmp.asp?action=query&field=1d,data
		'	上面的例子表示客戶端想查詢id和data字段,要查詢的字段用 "," 隔開
		'------------------------------------------------------------------
		if request("field") = "" then	'無參數值,查詢所有列
			sqlstr = "select * from temp order by id desc"
			set rs = conn.execute(sqlstr)	'取得數據集
		else	'有參數值,查詢相應的列
			field = request("field")
			sqlstr = "select "
			schar = ","
			
			'根據客戶端傳送參數值的個數(1個或多個),循環獲取參數
			Do
				if instr(field,schar) > 0 then
					pos = instr(field,schar)
					codition = mid(field,1,pos)
					sqlstr = sqlstr & codition
					field = mid(field,pos+1)
				else
					sqlstr = sqlstr & field
					Exit Do
				end if
			Loop
			
			sqlstr = sqlstr & " from temp order by id desc"
			set rs = conn.execute(sqlstr)	'取得數據集
		end if

		'輸出HTML代碼,格式化數據。
		response.write ("<TABLE bordercolorlight=#FFFFFF bordercolordark=#FFFFFF align=center border=1 bgcolor=#ACD8FF>")
		
		response.write ("<TR bgcolor=#008080>")
		
		'根據數據集的列名確定表格頭信息
		for intloop = 0 to rs.fields.count - 1
			response.write ("<TH>" & rs.fields(intloop).name & "</TH>")
		next
		
		response.write ("</TR>")
		
		'循環輸出每一條數據
		while not rs.eof
	
			response.write ("<TR>")
			for intloop = 0 to rs.fields.count - 1
				response.write ("<TD>" & trim (rs.fields(intloop).value) & "</TD>")
			next
			response.write ("</TR>")
		
			rs.movenext
		wend
	
		'關閉數據集
		rs.close
		set rs = nothing
		
		response.write ("</TABLE>")
		
	case "queryByID"	'查詢動作
		'------------------------------------------------------------------
		'根據客戶端傳送參數值的個數構造不同的sql語句
		'參數例子:
		'	tmp.asp?action=queryByID&id=1103
		'------------------------------------------------------------------
		id = request("id")	'獲得客戶端傳送的data參數值
		if id = "" then
			sqlstr = "select * from temp"
			set rs = conn.execute(sqlstr)	'取得數據集
		else
			sqlstr = "select * from temp where id = " & id
			set rs = conn.execute(sqlstr)	'取得數據集
		end if
		
		'輸出HTML代碼,格式化數據。
		response.write ("<TABLE bordercolorlight=#FFFFFF bordercolordark=#FFFFFF align=center border=1 bgcolor=#ACD8FF>")
		
		response.write ("<TR bgcolor=#008080>")
		
		'根據數據集的列名確定表格頭信息
		for intloop = 0 to rs.fields.count - 1
			response.write ("<TH>" & rs.fields(intloop).name & "</TH>")
		next
		
		response.write ("</TR>")
		
		'循環輸出每一條數據
		while not rs.eof
	
			response.write ("<TR>")
			for intloop = 0 to rs.fields.count - 1
				response.write ("<TD>" & trim (rs.fields(intloop).value) & "</TD>")
			next
			response.write ("</TR>")
		
			rs.movenext
		wend
	
		'關閉數據集
		rs.close
		set rs = nothing
		
		response.write ("</TABLE>")
		
	case "delete"	'刪除所有的數據
		sqlstr = "delete from temp"
		conn.execute(sqlstr)
		response.write "<RAW name=resp>OK</RAW>"	'返回操作成功標誌
		
	case default
		response.write "<RAW name=resp>OK</RAW>"
end select

'關閉數據庫連接
conn.close
set conn = nothing
%>

目錄名從1-56都可以在網站上正常訪問,從上面的代碼中我們可以發現,該腳本接收action變量通過switch進行判斷並進行相應的數據庫操作,如果是插入操作就設置action爲insert通過data傳值即可,而且維護人員也很貼心的把payload都給我們貼上了,下面總結一下利用方式
查詢內容

http://218.66.xx.x:7766/4/tmp.asp?action=query

增加內容

http://218.66.xx.x:7766/4/tmp.asp?action=insert&data=1111

刪除內容

http://218.66.xx.x:7766/4/tmp.asp?action=delete

在這裏插入圖片描述
目錄1-56都是這樣的,存在一個數據庫和一個操作文件,通過和上面相似的payload進行操作。
在這裏插入圖片描述
這裏其實還有一個存儲型xss的存在,我們來看一下
通過上述的插入方式,構建payload,如下圖。
在這裏插入圖片描述
然後返回訪問查詢信息,發現成功彈窗。
在這裏插入圖片描述
在這裏插入圖片描述
這裏我們瞭解到了之前那個迷惑行爲的一堆目錄。然後我們繼續往下看。

一段插曲

    說到這裏我就一句mmp,我們來看一下,通過文件搜索admin關鍵詞,我們找到了一個管理員登錄界面。
在這裏插入圖片描述
然後我就去搜索這個目錄,去查看源碼。
在這裏插入圖片描述
如圖所示,時間也確實久遠了。
在這裏插入圖片描述
本段代碼中,我們發現他進行了數據庫查詢,說實話,典型的SQL注入,這我不多說了。
我們看第一行他包含了conn.asp文件,這應該是是他數據庫連接文件,我們再去查看一些conn.asp文件。
在這裏插入圖片描述
看到這裏我們,是一段經典的數據庫連接代碼 ,下面有一個分頁方法。在箭頭所指處我們可以看到他查詢的是data/news.mdb數據庫文件。然後我們再去查看這個mdb文件。
在這裏插入圖片描述
我們拿到了後臺密碼,現在去登陸試一試吧。
在這裏插入圖片描述
講道理,看到這個的時候,我真想一走了之。
在這裏插入圖片描述
這裏告訴我們唯一有用的信息就是他的內網地址了,但是我到不了內網啊。說到這裏又是一把傷心淚。擦掉眼淚後,默默地合上了筆記本。在這裏插入圖片描述
不知是什麼又支撐着我打開了一個界面,他捆綁的是8090端口,本來想着繼續代碼審計找到密碼,但是測試的時候又讓我心涼了一截。
在這裏插入圖片描述
嘗試任意輸入一個文件名,沒想到猜對了。講道理看到這個的時候我高興了一下下,閱讀報錯,我們可以知道說我們對象引用未設置爲對象的實例,那咱們就給他賦值唄。
在這裏插入圖片描述
隨着賦值的過程還能往下看幾段代碼。
在這裏插入圖片描述
。。。。。
不知道小夥伴注沒注意上面那個箭頭?這個端口的http服務器是安裝在E盤的,所以咱們也不能通過代碼審計了。當然,我也知道他可能存在SQL注入,但是不知道各位想沒想到上面那個任意SQL執行的窗口,一想到他數據庫那奇怪的命名方式,抱手告辭!(那個SQL裏幾十個數據庫,沒法一個一個找啊)。說完,我又默默的合上了筆記本。

域控滲透

    這裏我們上傳msfvenom生成的木馬,通過之前拿到的shell使用pr提權工具去執行,在公網中搭建msf去獲取meterpreter,這裏我們發現已經獲取到system權限的meterpreter了。
在這裏插入圖片描述
然後使用run getgui -e打開3389端口並使用portfwd將目標3389端口轉發至本地6666端口。
在這裏插入圖片描述
繼續使用load mimikatz命令獲取管理員密碼。
在這裏插入圖片描述
遠程桌面進行連接
在這裏插入圖片描述
發現成功連接,繼續去探尋域的蹤跡。
在這裏插入圖片描述
使用ping命令探尋域控服務器內網地址。
在這裏插入圖片描述
得到內網地址爲172.27.0.12,然後我們返回meterpreter界面,通過獲取到的web服務器作爲跳板機進行掃描域控服務器端口。
在這裏插入圖片描述
域控服務器3389開放。繼續掃描發現服務器同時開放445端口,並且服務器版本爲Windows 2003 SP2那麼這裏我們不妨試一下ms08-067漏洞。
在這裏插入圖片描述
在這裏插入圖片描述
發現利用失敗,嘗試直接連接3389端口,想起之前遠程登錄時存在兩個域webs和dev那麼不妨使用獲取到的dev的那個administrator用戶密碼登錄。
在這裏插入圖片描述

成功登陸域控服務器。
在這裏插入圖片描述
上面我們獲取到了dev/administrator的密碼,通過代碼審計我們知道該站採用站庫分離原則,172.27.0.64就是數據庫服務器,嘗試登錄,發現成功遠程登陸,可獲取到服務器上數據庫信息。
在這裏插入圖片描述
以下域內開放3389的主機都可以遠程連接。
在這裏插入圖片描述
這裏其實有一個疑問。

在這裏插入圖片描述
我們登陸webs但其實並沒有E盤,這說明有兩個內網ip共用一個公網ip。
在這裏插入圖片描述

後記

    本次滲透講解就到這裏了,這個站其實如果深入滲透仍有很大的利用空間,正常來講可以添加持久性後門,方便後面利用,但是這裏沒有這麼做。我們所做的是測試而非破壞,做任何事情都要有底線,並不能因爲一點利益就去做違法亂紀的事情,正如我堅定的拒絕那些想拉攏我做黑產的人一樣,不幹就是不幹。
    最近個人的事情比較多,在家把所學的知識從頭複習,說實話收穫不小。可能大家覺得文章寫的短了一些,確實如此。寫文章的今天,在晚上還要去考一下360衆測的入駐考覈,所以時間倉促,寫的也就比較趕吧,希望大家多多見諒!那麼就先講到這裏了。
最後祝大家心想事成,美夢成真!

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