1.域渗透之外网打点到三层内网
2.SQLMap 源码阅读
3.PHP代码审计入门
4.拿站的源码步骤分几步
5.c#读取Config文件的问题
6.第79篇:记一次Oracle注入漏洞提权的艰难过程
域渗透之外网打点到三层内网
本次项目模拟渗透测试人员在授权的情况下,对目标进行渗透测试,收费从外网打点到内网横向渗透,源码最终获取整个内网权限。收费项目属于三层代理内网穿透,源码涵盖内网穿透技术、收费神仙脚指标源码工具利用、源码手写exp、收费外网打点方法、源码流行内网渗透测试办法等,收费对个人提升很有帮助。源码
在VPS映射部分,收费首先将内网IP映射到公网,源码使用frp工具实现。收费在公网VPS上运行frps.exe -c frps.ini,源码web1上运行frpc.ini,成功访问到环境。
信息收集方面,端口探测显示、、、、端口开放,网站源代码查找后发现网上银行系统,通过弱口令和暴力破解未能爆破出用户,但在GitHub上找到源码,发现数据库文件包含普通和管理员账户信息。
SQL注入测试发现存在Hsql注入漏洞,使用sqlmap无法获取用户名和密码,于是编写脚本成功跑出密码并登录。在另一个地址的tomexam系统中,注册用户后发现存在SQL注入,使用sqlmap获取用户信息,通过解密脚本成功登录管理员后台。
针对jspxcms-SQL注入,闪电借款源码首页允许注册和登录,搜索历史漏洞后发现可以通过文件上传实现getshell,使用sqlmap查找表、用户和密码。登录后编写目录穿越脚本成功上传,获取webshell并使用哥斯拉连接。
内网渗透中,首先配置内网cobalt strike上线,使用frp反向代理实现。使用shell iponfig收集信息,测试与其他域内主机的连通性,查看计算机名,发现无法找到域内其他主机。查看server的IP地址,发现存在Mysql端口,尝试暴力破解后成功获取账号和密码,使用mysql用户登录Mssql服务器,通过xp_cmshell进行信息收集,使用certutil远程下载木马实现上线。
在域渗透阶段,使用net view查看域内主机,使用hashdump抓取用户hash值,获取域控IP地址和计算机名。编译并测试zerolgin脚本,将其设置为空密码。配置kali代理,获取域控hash值并登录,关闭防火墙使用pth上线cs,生成tcp监听后jump到域控主机,成功恢复密码并获取hash值。
项目涉及环境搭建、信息收集、工具利用、手写exp、jeeplus破解源码下载外网打点、内网穿透、内网渗透、域渗透等全面技术,是一次从外网到内网、再到域控的完整渗透测试演练。尽管靶机未安装杀软,但此过程展示了从外网到内网、再到域控的广泛知识和技能。
SQLMap 源码阅读
本文主要解析了SQLMap的源码阅读流程。首先,我们确认了SQLMap运行的流程图,这有助于我们深入理解源码。在开始SQLMap运行前,程序进行一系列初始化操作,包括环境设置、依赖加载、变量配置等。
接下来,我们处理URL。通过cmdLineParser()从命令行获取参数,进而通过initOptions(cmdLineOptions)解析这些命令行参数。初始化函数中,通过loadBoundaries()、loadPayloads()、_loadQueries()加载payload,这些函数负责从XML文件中加载边界、payload和查询。在loadBoundaries()中,程序读取data/xml/boundaries.xml文件并解析其中的XML,将结果添加到conf对象的tests属性中。conf对象存储了目标的相关信息以及配置信息。
在URL处理阶段,程序通过getCurrentThreadData()获取当前线程数据,webview加载html源码并调用f(*args, **kwargs)进行处理。这里的逻辑位于/lib/controller/controller.py文件下,主要工作包括打印日志、赋值和添加HTTP Header等,最终到达parseTargetUrl()函数。在该函数中,程序进行URL的剖析与拆解,并将这些内容保存到conf对象的对应属性中,以便后续使用。
接着,SQLMap会生成注入检测的payload,核心代码位于controller.py文件的行。在setupTargetEnv()函数中,程序调用hashDBRetrieve()函数,根据参数KB_INJECTIONS检索payload。payload生成逻辑在第行,执行SQL语句并使用basePickle进行加密。最终,程序生成payload并进行探测,如果目标返回Connection refused,则返回False。
在WAF检测部分,当URL处理完毕后,程序进行探测,判断目标是否存在WAF。如果存在WAF,则生成用于fuzz的payload,这个payload基于 这个网站,ip.wen.la
都是找旁注不错的方法。
第五:没旁注 ,那就得看服务器了 ,开启了什么端口。比如 什么的。这些端口大家懂的智客网 源码。FTP是有办法爆破的。
第六:敏感端口没有开启。那就返回来继续观察网站。看下网站的设计。有什么网站是和这个网站是一样的。可以拿下那个网站下载下源码查看下有什么漏洞。
总结:据我所知一般的网站都是有XSS漏洞的。虽然没多少权限,但是多数前台权限还是有的。
最后说下要学习渗透的步骤。这个只是我自己的想法。
各种工具利用----了解各种数据库(access mysql mssql )-----手工学习(更容易了解网站原理)----做笔记(把自己拿站的笔记记下,拿复杂的站会有用的。)暂时就说这么多了。
c#读取Config文件的问题
应用程序配置文件(App.config)是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。
对于一个config文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ServerIP" value=".0.0.1"></add>
<add key="DataBase" value="WarehouseDB"></add>
<add key="user" value="sa"></add>
<add key="password" value="sa"></add>
</appSettings>
</configuration>
对config配置文件的读写类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Configuration;
using System.ServiceModel;
using System.ServiceModel.Configuration;
namespace NetUtilityLib
{
public static class ConfigHelper
{
//依据连接串名字connectionName返回数据连接字符串
public static string GetConnectionStringsConfig(string connectionName)
{
//指定config文件读取
string file = System.Windows.Forms.Application.ExecutablePath;
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(file);
string connectionString =
config.ConnectionStrings.ConnectionStrings[connectionName].ConnectionString.ToString();
return connectionString;
}
///<summary>
///更新连接字符串
///</summary>
///<param name="newName">连接字符串名称</param>
///<param name="newConString">连接字符串内容</param>
///<param name="newProviderName">数据提供程序名称</param>
public static void UpdateConnectionStringsConfig(string newName, string newConString, string newProviderName)
{
//指定config文件读取
string file = System.Windows.Forms.Application.ExecutablePath;
Configuration config = ConfigurationManager.OpenExeConfiguration(file);
bool exist = false; //记录该连接串是否已经存在
//如果要更改的连接串已经存在
if (config.ConnectionStrings.ConnectionStrings[newName] != null)
{
exist = true;
}
// 如果连接串已存在,首先删除它
if (exist)
{
config.ConnectionStrings.ConnectionStrings.Remove(newName);
}
//新建一个连接字符串实例
ConnectionStringSettings mySettings =
new ConnectionStringSettings(newName, newConString, newProviderName);
// 将新的连接串添加到配置文件中.
config.ConnectionStrings.ConnectionStrings.Add(mySettings);
// 保存对配置文件所作的更改
config.Save(ConfigurationSaveMode.Modified);
// 强制重新载入配置文件的ConnectionStrings配置节
ConfigurationManager.RefreshSection("ConnectionStrings");
}
///<summary>
///返回*.exe.config文件中appSettings配置节的value项
///</summary>
///<param name="strKey"></param>
///<returns></returns>
public static string GetAppConfig(string strKey)
{
string file = System.Windows.Forms.Application.ExecutablePath;
Configuration config = ConfigurationManager.OpenExeConfiguration(file);
foreach (string key in config.AppSettings.Settings.AllKeys)
{
if (key == strKey)
{
return config.AppSettings.Settings[strKey].Value.ToString();
}
}
return null;
}
///<summary>
///在*.exe.config文件中appSettings配置节增加一对键值对
///</summary>
///<param name="newKey"></param>
///<param name="newValue"></param>
public static void UpdateAppConfig(string newKey, string newValue)
{
string file = System.Windows.Forms.Application.ExecutablePath;
Configuration config = ConfigurationManager.OpenExeConfiguration(file);
bool exist = false;
foreach (string key in config.AppSettings.Settings.AllKeys)
{
if (key == newKey)
{
exist = true;
}
}
if (exist)
{
config.AppSettings.Settings.Remove(newKey);
}
config.AppSettings.Settings.Add(newKey, newValue);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
// 修改system.serviceModel下所有服务终结点的IP地址
public static void UpdateServiceModelConfig(string configPath, string serverIP)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
ConfigurationSectionGroup sec = config.SectionGroups["system.serviceModel"];
ServiceModelSectionGroup serviceModelSectionGroup = sec as ServiceModelSectionGroup;
ClientSection clientSection = serviceModelSectionGroup.Client;
foreach (ChannelEndpointElement item in clientSection.Endpoints)
{
string pattern = @"\b\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\b";
string address = item.Address.ToString();
string replacement = string.Format("{ 0}", serverIP);
address = Regex.Replace(address, pattern, replacement);
item.Address = new Uri(address);
}
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("system.serviceModel");
}
// 修改applicationSettings中App.Properties.Settings中服务的IP地址
public static void UpdateConfig(string configPath, string serverIP)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
ConfigurationSectionGroup sec = config.SectionGroups["applicationSettings"];
ConfigurationSection configSection = sec.Sections["DataService.Properties.Settings"];
ClientSettingsSection clientSettingsSection = configSection as ClientSettingsSection;
if (clientSettingsSection != null)
{
SettingElement element1 = clientSettingsSection.Settings.Get("DataService_SystemManagerWS_SystemManagerWS");
if (element1 != null)
{
clientSettingsSection.Settings.Remove(element1);
string oldValue = element1.Value.ValueXml.InnerXml;
element1.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);
clientSettingsSection.Settings.Add(element1);
}
SettingElement element2 = clientSettingsSection.Settings.Get("DataService_EquipManagerWS_EquipManagerWS");
if (element2 != null)
{
clientSettingsSection.Settings.Remove(element2);
string oldValue = element2.Value.ValueXml.InnerXml;
element2.Value.ValueXml.InnerXml = GetNewIP(oldValue, serverIP);
clientSettingsSection.Settings.Add(element2);
}
}
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("applicationSettings");
}
private static string GetNewIP(string oldValue, string serverIP)
{
string pattern = @"\b\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\.\d{ 1,3}\b";
string replacement = string.Format("{ 0}", serverIP);
string newvalue = Regex.Replace(oldValue, pattern, replacement);
return newvalue;
}
}
}
测试代码如下:
class Program
{
static void Main(string[] args)
{
try
{
//string file = System.Windows.Forms.Application.ExecutablePath + ".config";
//string file1 = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
string serverIP = ConfigHelper.GetAppConfig("ServerIP");
string db = ConfigHelper.GetAppConfig("DataBase");
string user = ConfigHelper.GetAppConfig("user");
string password = ConfigHelper.GetAppConfig("password");
Console.WriteLine(serverIP);
Console.WriteLine(db);
Console.WriteLine(user);
Console.WriteLine(password);
ConfigHelper.UpdateAppConfig("ServerIP", "..1.");
string newIP = ConfigHelper.GetAppConfig("ServerIP");
Console.WriteLine(newIP);
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
第篇:记一次Oracle注入漏洞提权的艰难过程
大家好,我是ABC_。我近期遇到了一个Oracle注入漏洞,是搜索型的盲注漏洞,只能通过折半法一个字符一个字符的猜解数据。经过判断,发现这是DBA权限的注入点。接下来,我将分享如何通过这个注入点获取操作系统的权限,并且分享了在技术研究过程中遇到的问题和解决方法。
在解决这个问题时,我进行了两方面的优化来加快SQL注入的速度。首先,我在search=%语句中加入了存在结果很少的搜索值,比如将search=%,只显示出一条搜索结果,这样可以减少数据库的检索量和HTTP返回的数据包大小,从而加快SQL注入的速度。其次,我修改了SQLmap的默认个线程限制,这需要修改SQLmap的源码,这里就不详细解释了。
在Oracle注入提权的语句方面,我注意到很多文章给出的语句通常分为三个步骤,其中第二步就是赋予当前Oracle账号相关的JAVA权限。然而,这个语句包含了大量的单引号和左右尖括号,有时候会被转义掉导致注入失败,而且这个语句异常复杂,容易出错。因此,我使用了一个简单的语句替代,效果更佳。这个语句的格式是BEGIN开头,然后end;结尾,代表一个PL/SQL语句块,如下所示:select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''grant javasyspriv to test''; end;') from dual。
我使用了SQLmap的--sql-shell命令将上述语句执行,但是最后执行的命令没有成功。在处理这种情况时,我通常有两种可能:一是执行命令被拦截,二是Java代码没有执行成功。因此,我使用了如下SQL语句进行判断,结果返回0,说明函数没有添加成功。经过一系列测试,我发现是SQLmap的SQL-shell下功能下,上述复杂的SQL语句根本没执行成功。
为了更方便地执行Oracle的复杂SQL语句,我将SQL注入语句进行了修改,通过and (插入SQL语句) is not null的方式,可以在左右括号中插入各种Oracle的SQL语句。然而,这种方法也遇到了WAF拦截的问题。为了解决这个问题,我使用了Oracle特有的编码方式,将SQL语句成功执行。再次执行查询LinuxUtil是否存在的SQL语句,发现返回count()不为0,说明Java代码成功添加执行。然而,LinuxUtil命令依然无法执行,我怀疑是Java权限没有添加成功。我执行了查询当前用户权限的语句,发现当前用户具有CONNECT、RESOURCE、JAVASYSPRIV权限,说明Java相关权限确实是添加成功了。然而,为什么还是无法调用LinuxUtil命令呢?我重新搭建了测试环境,使用Navicat执行Oracle提权语句后,发现报了权限错误。
在查阅大量国外文章后,我发现判断当前用户是否有Java权限,需要查询session_roles表。该表用于显示当前会话中的角色信息,必须session_roles中有JAVASYSPRIV权限才行。我尝试断开Oracle当前账号的连接,重新连接之后,session_roles表中就有相应权限了。然而,我们是在SQL注入点,无法断开重连,那么如何使Java权限立即生效呢?国外文章给出了几种方法,但执行后仍然无法解决问题。
在等待第二天后,惊奇地发现session_roles中存在JAVASYSPRIV角色了,我也不清楚原因,但此时可以通过select LinuxExecHanshu('whoami') from dual执行命令。然而,盲注过程太麻烦,我选择结合SQLmap的SQL-shell终端来盲注入,因为该SQL语句比较简短,SQLmap的SQL-shell模式猜解是完全无压力的。最终,我们成功获取了系统权限。
总结来说,这个dbms_xmlquery.newcontext函数在高版本的Oracle数据库中已经不能提权成功,甚至不能使用,需要使用其他方法进行提权。在本地搭建的Oracle环境中,大多数情况下可以直接提权成功,但极少数情况下需要断开重连,具体原因不明。如果文章中有错误,欢迎批评指正。后续,我将继续分享Oracle提权的其他方法,敬请期待。
如何入门黑客工具箱Kali? - 知乎
QingScan支持的黑客工具箱Kali清单: 1. Xray:一款功能强大的安全评估工具,具备多款一线安全从业者的精心设计与优化。 2. Awvs:全称为Acunetix Web Vulnerability Scanner,专用于扫描web应用程序上的安全问题,如SQL注入、XSS、目录遍历等。 3. Rad:一款专为安全扫描而设计的浏览器爬虫。 4. Masscan:进行快速端口扫描的工具,适用于大型网络的扫描。 5. Nmap:Gordon Lyon开发的网络扫描工具,能识别网络上的主机和服务,具备强大的网络枚举和测试功能。 6. Fortify:HP的产品,用于静态、白盒的软件源代码安全测试,能识别代码中的安全漏洞。 7. Kunlun-M:支持PHP、JavaScript等语义分析,以及Chrome扩展、Solidity的基础扫描。 8. Semgrep:快速、开源的静态分析工具,用于检测代码错误和执行代码标准。 9. Pocsuite:知道创宇实验室研发的远程漏洞测试框架,支持漏洞验证、开发PoC/Exp和集成至其他工具。 . Whatweb:自动识别CMS、BLOG等Web系统,用于web指纹识别。 . Oneforall:子域名信息收集的工具,功能强大。 . Hydra:爆破工具,支持多种服务的账号和密码破解。 . Sqlmap:检测和利用SQL注入漏洞的工具,具备自动化处理功能。 . Dirmap:高级web目录、文件扫描工具,功能超越了DirBuster、Dirsearch等。 . 河马Webshell检测:专注于webshell查杀,采用双引擎技术,查杀速度快、精度高。 . Wafwfscan:自动识别WAF的工具。 . Nuclei:基于模块进行请求发送的网络侦查工具,具备在被WAF后自动重传的功能。 . Vulmap:对web应用进行漏洞扫描和验证的工具,支持多种web应用的漏洞扫描。 . Crawergo:使用chrome headless模式进行URL收集的浏览器爬虫,能收集网站入口。 . Dismap:快速识别Web指纹信息,辅助定位资产。 -. PHP、Java、Python依赖检测:自研工具,用于白盒审计时读取项目依赖。 . GitHub安全公告:自研工具,获取GitHub的安全公告。 . GitHub关键字检测:通过搜索GitHub自动找出源码泄露。 . 免费代理获取:自研工具,自动搜索HTTP代理。 . gitee热门项目获取:自动获取热门项目,用于代码审计。 . 数据库备份:自动备份数据库。 . updateRegion:自动更新IP所属地域信息。 如需加入交流群,可点击阅读原文,自动跳转到QingScan工具介绍页扫码入群。