J2EE远程代码执行那些事儿(框架层面)
在J2EE远程代码执行中,大部分的代码执行情况的本质是,能够从外部去直接控制Java对象(其他语言暂不讨论,其实也差不多),控制Java对象大致包括几种情况:直接new对象;调用对象的方法(包括静态方法);访问对象的属性(赋值)等
那么一些J2EE框架在设计之中,如果某些功能允许以上操作,可能出现的远程代码执行情况。
那么我们在使用OGNL实现某些J2EE框架功能或者机制中,如果getValue或setValue函数是允许外部参数直接完整内容传入的,那肯定是很危险的!!!
比如:webWork及Struts2框架(其实真是不想说,Struts2简直就是在拖Java安全水平的后腿。它所有OGNL远程执行代码的漏洞的形成,可以用一句话简单概括:在使用OGNL实现框架某些功能或机制时,允许外部参数直接传入OGNL表达式或安全限制被饶过等)
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在J2EE远程代码执行中,大部分的代码执行情况的本质是,能够从外部去直接控制Java对象(其他语言暂不讨论,其实也差不多),控制Java对象大致包括几种情况:直接new对象;调用对象的方法(包括静态方法);访问对象的属性(赋值)等
那么一些J2EE框架在设计之中,如果某些功能允许以上操作,可能出现的远程代码执行情况。
那么我们在使用OGNL实现某些J2EE框架功能或者机制中,如果getValue或setValue函数是允许外部参数直接完整内容传入的,那肯定是很危险的!!!
比如:webWork及Struts2框架(其实真是不想说,Struts2简直就是在拖Java安全水平的后腿。它所有OGNL远程执行代码的漏洞的形成,可以用一句话简单概括:在使用OGNL实现框架某些功能或机制时,允许外部参数直接传入OGNL表达式或安全限制被饶过等)
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
数据库信息在哪儿
寻找方式
先说一般的数据库连接信息。
第一种
一般在web.config,如某套OA就是将连接字符串存放在该文件内
第二种
有的ASP.NET程序功能较多,会自定义其它config文件,所以可能会存在多个config,而数据库连接信息就存放在其它config文件中,比如逐浪CMS(你们懂的)就有多个config文件
但数据库相关连接信息存放在ConfigConnectionStrings.config
第三种
也有更标新立异的压根不存放在config中,比如信游(你们也懂的)的免费版,也有一个config文件夹
第四种
有一些比较奇葩的,直接写在代码中。这种情况下如果没有源码cs文件,就只能反编译bin目录下的dll文件了,必须扩展开来说,这是后话了。
数据库文件
那如果是access或者SQLite的情况又会有什么变化呢?他们的数据库会存放在什么位置?
现在大多CMS为了避免直接下载MDB或相关格式的问题,在.NET中采取了其它手段去防下载,比如50cms将SQLite的数据库存放在根目录的App_Data文件夹中
另外还有直接将access数据库存放在App_Code文件夹中的,保存为.cs后缀,由于App_Code和App_Data是无法直接通过post和get来直接访问的(你有任意文件下载的话谁都拦不住你),所以在一定程度上保证了网站的安全性,比如下面的2013.cs实际就是网站的数据库
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
寻找方式
先说一般的数据库连接信息。
第一种
一般在web.config,如某套OA就是将连接字符串存放在该文件内
第二种
有的ASP.NET程序功能较多,会自定义其它config文件,所以可能会存在多个config,而数据库连接信息就存放在其它config文件中,比如逐浪CMS(你们懂的)就有多个config文件
但数据库相关连接信息存放在ConfigConnectionStrings.config
第三种
也有更标新立异的压根不存放在config中,比如信游(你们也懂的)的免费版,也有一个config文件夹
第四种
有一些比较奇葩的,直接写在代码中。这种情况下如果没有源码cs文件,就只能反编译bin目录下的dll文件了,必须扩展开来说,这是后话了。
数据库文件
那如果是access或者SQLite的情况又会有什么变化呢?他们的数据库会存放在什么位置?
现在大多CMS为了避免直接下载MDB或相关格式的问题,在.NET中采取了其它手段去防下载,比如50cms将SQLite的数据库存放在根目录的App_Data文件夹中
另外还有直接将access数据库存放在App_Code文件夹中的,保存为.cs后缀,由于App_Code和App_Data是无法直接通过post和get来直接访问的(你有任意文件下载的话谁都拦不住你),所以在一定程度上保证了网站的安全性,比如下面的2013.cs实际就是网站的数据库
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
密码管理利器:Linux - KeePassX
随着安全性问题变得越来越重要,密码当然是越安全越理想(比如多步认证)。
于是我最近就试用了几个安全密码管理器,试图找到一款比较安全,易于使用并且跨平台的应用软件。
首先,我尝试了LastPass。LastPass大概最为人们所熟知,因为它是基于WEB管理密码的,是所有软件中平台无关性最强的。但是我发现它的界面简陋,而且提供太多的工具和选项,比较繁琐。
接下来,我又试了试KeePass 2。尽管是一款功能相当完善的应用软件,非常类似于下面我将要描述的,但是官方没有提供Linux的安装包,而且社区移植的版本,虽然可用,但仍然算不上最好的。所以我又尝试了其他应用。
在所有的试用过的软件中,我最喜欢的是 KeePassX 。 它原来是KeePass的在Linux上的移植版,但是后来演变成了独立的应用。凭借更漂亮、更原生的外观,KeePassX 打败了KeePass 2。
在ubuntu中使用KeePassX
方便的是,KeePassX已经提供在ubuntu上安装的软件包。
从命令行安装KeePassX或者 从软件管理中心安装:
从Ubuntu软件中心安装KeePassX
安装后打开它,你会看到一个空白窗口。点击工具条上的第一个按钮来创建一个新数据库。你可以使用密钥文件或者密码保护这个刚刚创建的数据库。一般你会使用密码,因为只需要记住它并输入就行了 - 你应该输入较长的密码,这样你就可以防止其他人使用你的数据库。
接下来,你得把它存到某个位置。我保存在我的Dropbox里面,这样就可以从多个地方获取。
Dropbox使用双因子认证,所以如果有人想进到我的Dropbox里面,他就得拿到我的手机,这样的方式是还是相当安全的。
或者你也可以使用其他的服务,比如Google Drive和Skydrive,它们都可以使用认证器应用;也可以使用Box,它用短信进行双因子认证。
当然,如果你真的很在意自己的密码,你很可能不想把密码存到其他的地方,因为理论上密码是可以被他们获取到的。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
随着安全性问题变得越来越重要,密码当然是越安全越理想(比如多步认证)。
于是我最近就试用了几个安全密码管理器,试图找到一款比较安全,易于使用并且跨平台的应用软件。
首先,我尝试了LastPass。LastPass大概最为人们所熟知,因为它是基于WEB管理密码的,是所有软件中平台无关性最强的。但是我发现它的界面简陋,而且提供太多的工具和选项,比较繁琐。
接下来,我又试了试KeePass 2。尽管是一款功能相当完善的应用软件,非常类似于下面我将要描述的,但是官方没有提供Linux的安装包,而且社区移植的版本,虽然可用,但仍然算不上最好的。所以我又尝试了其他应用。
在所有的试用过的软件中,我最喜欢的是 KeePassX 。 它原来是KeePass的在Linux上的移植版,但是后来演变成了独立的应用。凭借更漂亮、更原生的外观,KeePassX 打败了KeePass 2。
在ubuntu中使用KeePassX
方便的是,KeePassX已经提供在ubuntu上安装的软件包。
从命令行安装KeePassX或者 从软件管理中心安装:
从Ubuntu软件中心安装KeePassX
安装后打开它,你会看到一个空白窗口。点击工具条上的第一个按钮来创建一个新数据库。你可以使用密钥文件或者密码保护这个刚刚创建的数据库。一般你会使用密码,因为只需要记住它并输入就行了 - 你应该输入较长的密码,这样你就可以防止其他人使用你的数据库。
接下来,你得把它存到某个位置。我保存在我的Dropbox里面,这样就可以从多个地方获取。
Dropbox使用双因子认证,所以如果有人想进到我的Dropbox里面,他就得拿到我的手机,这样的方式是还是相当安全的。
或者你也可以使用其他的服务,比如Google Drive和Skydrive,它们都可以使用认证器应用;也可以使用Box,它用短信进行双因子认证。
当然,如果你真的很在意自己的密码,你很可能不想把密码存到其他的地方,因为理论上密码是可以被他们获取到的。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
Content Provider组件是Android应用的重要组件之一,管理对数据的访问,主要用于不同的应用程序之间实现数据共享的功能。Content Provider的数据源不止包括SQLite数据库,还可以是文件数据。通过将数据储存层和应用层分离,Content Provider为各种数据源提供了一个通用的接口。
创建一个自己的Content Provider需要继承自ContentProvider抽象类,需要重写其中的onCreate()、query()、insert()、update()、delete()、getType()六个抽象方法,这些方法实现对底层数据源的增删改查等操作。还需在AndroidManifest文件注册Content Provider,注册时指定访问权限、exported属性、authority属性值等。
其它APP使用ContentResolver对象来查询和操作Content Provider,此对象具有Content Provider中同名的方法名。这样其他APP接就可以访问Content Provider对应的数据源的底层数据,而无须知道数据的结构或实现。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
创建一个自己的Content Provider需要继承自ContentProvider抽象类,需要重写其中的onCreate()、query()、insert()、update()、delete()、getType()六个抽象方法,这些方法实现对底层数据源的增删改查等操作。还需在AndroidManifest文件注册Content Provider,注册时指定访问权限、exported属性、authority属性值等。
其它APP使用ContentResolver对象来查询和操作Content Provider,此对象具有Content Provider中同名的方法名。这样其他APP接就可以访问Content Provider对应的数据源的底层数据,而无须知道数据的结构或实现。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
私有权限定义错误导致数据被任意访问
私有权限定义经常发生的风险是:定义了私有权限,但是却根本没有定义私有权限的级别,或者定义的权限级别不够,导致恶意应用只要声明这个权限就能够访问到相应的Content Provider提供的数据,造成数据泄露。
以公开的乌云漏洞WooYun-2014-57590为例:
某网盘客户端使用了自己的私有权限,但是在AndroidManifest中却没有定义私有权限,其它APP只要声明这个权限就能访问此网盘客户端提供的Provider,从而访问到用户数据。
在网盘客户端的AndroidManifest中注册Provider时,声明了访问时需要的读写权限,并且权限为客户端自定义的私有权限
但是在AndroidManifest中却没有见到私有权限“com.huawei.dbank.v7.provider.DBank.READ_DATABASE”和“com.huawei.dbank.v7.provider.DBank.WRITE_DATABASE”的定义
反编译客户端后查看到的URI,根据这些可以构造访问到Provider的URI
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
私有权限定义经常发生的风险是:定义了私有权限,但是却根本没有定义私有权限的级别,或者定义的权限级别不够,导致恶意应用只要声明这个权限就能够访问到相应的Content Provider提供的数据,造成数据泄露。
以公开的乌云漏洞WooYun-2014-57590为例:
某网盘客户端使用了自己的私有权限,但是在AndroidManifest中却没有定义私有权限,其它APP只要声明这个权限就能访问此网盘客户端提供的Provider,从而访问到用户数据。
在网盘客户端的AndroidManifest中注册Provider时,声明了访问时需要的读写权限,并且权限为客户端自定义的私有权限
但是在AndroidManifest中却没有见到私有权限“com.huawei.dbank.v7.provider.DBank.READ_DATABASE”和“com.huawei.dbank.v7.provider.DBank.WRITE_DATABASE”的定义
反编译客户端后查看到的URI,根据这些可以构造访问到Provider的URI
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在进行APP设计时,要清楚哪些Provider的数据是用户隐私数据或者其他重要数据,考虑是否要提供给外部应用使用,如果不需要提供,则在AndroidManifes文件中将其exported属性显式的设为“false”,这样就会减少了很大一部分的攻击面。
人工排查肯定比较麻烦,建议开发者使用阿里聚安全提供的安全扫描服务,在APP上线前进行自动化的安全扫描,尽早发现并规避这样的风险。
注意:
由于Android组件Content Provider无法在Android 2.2(即API Level 8)系统上设为不导出,因此建议声明最低SDK版本为8以上版本(这已经是好几年前的SDK了,现在一般都会大于此版本);
由于API level 在17以下的所有应用的“android:exported”属性默认值都为true,因此如果应用的Content Provider不必要导出,建议显式设置注册的Content Provider组件的“android:exported”属性为false;
如果必须要有数据提供给外部应用使用,则做好设计,做好权限控制,明确什么样的外部应用可以使用,如对于本公司的应用在权限定义时用相同签名即可,合作方的应用检查其签名;不过还是尽量不提供用户隐私敏感信息。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
人工排查肯定比较麻烦,建议开发者使用阿里聚安全提供的安全扫描服务,在APP上线前进行自动化的安全扫描,尽早发现并规避这样的风险。
注意:
由于Android组件Content Provider无法在Android 2.2(即API Level 8)系统上设为不导出,因此建议声明最低SDK版本为8以上版本(这已经是好几年前的SDK了,现在一般都会大于此版本);
由于API level 在17以下的所有应用的“android:exported”属性默认值都为true,因此如果应用的Content Provider不必要导出,建议显式设置注册的Content Provider组件的“android:exported”属性为false;
如果必须要有数据提供给外部应用使用,则做好设计,做好权限控制,明确什么样的外部应用可以使用,如对于本公司的应用在权限定义时用相同签名即可,合作方的应用检查其签名;不过还是尽量不提供用户隐私敏感信息。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
TeslaCrypt(以及AlphaCrypt,下文统称为“TC”)算是比较“成熟”的勒索软件,其版本从0.2逐步升级到目前已知的最高版本4.0+(也不知道有没有Insider Preview)。随着版本的升级,其加密和密钥处理技巧也在不断升级。
勒索软件的制作者为了打到目的,通常会给用户一个比特币钱包的地址。用户向该钱包付款之后,可以得到一个解密密钥,用此密钥即可解密。有报告指出,不同的受害者需要向不同的钱包中打款,这暗示着比特币钱包的生成过程可能与加密密钥的产生存在一定关联。因此,先大致了解下钱包是如何生成的。
比特币钱包生成的基本步骤是:
初始化一对可用于ECDSA签名的密钥Public/PrivateBtcKey
用SHA256对PublicBtcKey做蛤希,得到S256_PublicBtcKey
用RIPEMD-160对上一个结果做哈希,然后在哈希前部加入版本号得到VR160_S256_PublicBtcKey
在上一哈希前部加入版本号,并做两次哈希,将结果的前4字节附加在VR160_S256_PublicBtcKey后,最后使用Base58算法编码。这时得到的就是长33个字符的钱包地址。
TC被首次载入时,就生成了一对PublicBtcKey/PrivateBtcKey。其中,PublicBtcKey就是向用户显示的地址,而PrivateBtcKey则被发送给C&C服务器,以进行之后的转账操作。不同版本的TC,这一点是不变的。
TC作者本次公布的密钥是四号密钥,应用于TC3.0以及TC4.0版本。这两个版本都采用了比较完整的分层密钥机制,并且提高了样本隐蔽性。TC4.0的准备过程
准备随机数生成器等;
生成随机数,并用714号曲线(即secp256k1)建立比特币钱包,对应密钥Public_BtcKey和Private_BtcKey;
对Private_BtcKey做SHA-256哈希,得到Private_HashedPRBK,用Public_BtcKey算出钱包地址,一会展示给客户;
用Private_HashedPRBK带入曲线,得到第二对密钥Public_HashedPRBK;
拥有一对密钥Public/Private_MalMaster。这对密钥里,Public_MalMaster是由TC作者置入程序的,而Private_MalMaster则是本次被作者公布的“主密钥”,难以被运算出来;
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
勒索软件的制作者为了打到目的,通常会给用户一个比特币钱包的地址。用户向该钱包付款之后,可以得到一个解密密钥,用此密钥即可解密。有报告指出,不同的受害者需要向不同的钱包中打款,这暗示着比特币钱包的生成过程可能与加密密钥的产生存在一定关联。因此,先大致了解下钱包是如何生成的。
比特币钱包生成的基本步骤是:
初始化一对可用于ECDSA签名的密钥Public/PrivateBtcKey
用SHA256对PublicBtcKey做蛤希,得到S256_PublicBtcKey
用RIPEMD-160对上一个结果做哈希,然后在哈希前部加入版本号得到VR160_S256_PublicBtcKey
在上一哈希前部加入版本号,并做两次哈希,将结果的前4字节附加在VR160_S256_PublicBtcKey后,最后使用Base58算法编码。这时得到的就是长33个字符的钱包地址。
TC被首次载入时,就生成了一对PublicBtcKey/PrivateBtcKey。其中,PublicBtcKey就是向用户显示的地址,而PrivateBtcKey则被发送给C&C服务器,以进行之后的转账操作。不同版本的TC,这一点是不变的。
TC作者本次公布的密钥是四号密钥,应用于TC3.0以及TC4.0版本。这两个版本都采用了比较完整的分层密钥机制,并且提高了样本隐蔽性。TC4.0的准备过程
准备随机数生成器等;
生成随机数,并用714号曲线(即secp256k1)建立比特币钱包,对应密钥Public_BtcKey和Private_BtcKey;
对Private_BtcKey做SHA-256哈希,得到Private_HashedPRBK,用Public_BtcKey算出钱包地址,一会展示给客户;
用Private_HashedPRBK带入曲线,得到第二对密钥Public_HashedPRBK;
拥有一对密钥Public/Private_MalMaster。这对密钥里,Public_MalMaster是由TC作者置入程序的,而Private_MalMaster则是本次被作者公布的“主密钥”,难以被运算出来;
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
内网渗透思路探索 之新思路的探索与验证
基于这样的渗透思路,开始尝试寻找试验目标。
关于试验用目标,有几点要求,首先是在一个工作组环境中,(其次)拥有较多的主机或者较大网络。经过不断寻找,成功渗透进一个满足我需求的内网。
目标是一个学校,渗透的过程比较平常,注入,上shell,反弹不成功,正向反弹,控制服务器,没有太多的亮点。
然后开始针对网络设备进行攻击。利用正向反弹工具,将我的kali接入了内网,定向攻击网关设备。利用snmp的弱口令,直接获取了三层交换的控制权限。
注:kali的snmpwalk 不能利用proxychains走socks5代理,攻击内网机器,暂不清楚原因。
这里需要多说一下,我并没有直接进行固件级别的EXP测试,因为在exploit-db上的路由器固件的远程命令执行exp并不多,有很多的exp并没有公开,并且由于自己没有构造EXP的能力,遂放弃通过EXP获取权限的思路。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
基于这样的渗透思路,开始尝试寻找试验目标。
关于试验用目标,有几点要求,首先是在一个工作组环境中,(其次)拥有较多的主机或者较大网络。经过不断寻找,成功渗透进一个满足我需求的内网。
目标是一个学校,渗透的过程比较平常,注入,上shell,反弹不成功,正向反弹,控制服务器,没有太多的亮点。
然后开始针对网络设备进行攻击。利用正向反弹工具,将我的kali接入了内网,定向攻击网关设备。利用snmp的弱口令,直接获取了三层交换的控制权限。
注:kali的snmpwalk 不能利用proxychains走socks5代理,攻击内网机器,暂不清楚原因。
这里需要多说一下,我并没有直接进行固件级别的EXP测试,因为在exploit-db上的路由器固件的远程命令执行exp并不多,有很多的exp并没有公开,并且由于自己没有构造EXP的能力,遂放弃通过EXP获取权限的思路。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke