ufo.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. /*
  2. UFONet - Denial of Service Toolkit - 2013/2020 - by psy (epsylon@riseup.net)
  3. You should have received a copy of the GNU General Public License along
  4. with UFONet; if not, write to the Free Software Foundation, Inc., 51
  5. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  6. */
  7. // this variable defines the delay between each ajax update (statistics and geoip information)
  8. var AJAX_DELAY = 1234
  9. // interface control definitions, managed by leaflet
  10. var UfoControlClass = L.Control.extend({
  11. options: {
  12. position: 'bottomright'
  13. },
  14. onAdd: function (map) {
  15. var container = L.DomUtil.create('div', 'ufo_msg_div leaflet-control-layers leaflet-control-layers-expanded')
  16. L.DomEvent.on(container,'mousedown',L.DomEvent.stopPropagation)
  17. .on(container,'doubleclick',L.DomEvent.stopPropagation)
  18. .on(container,'click',L.DomEvent.stopPropagation)
  19. return container;
  20. }
  21. });
  22. var UfoTitleClass = L.Control.extend({
  23. options: {
  24. position: 'topleft'
  25. },
  26. onAdd: function (map) {
  27. var container = L.DomUtil.create('div', 'ufo_title_div leaflet-control-layers leaflet-control-layers-expanded')
  28. return container;
  29. }
  30. });
  31. var UfoErrorClass = L.Control.extend({
  32. options: {
  33. position: 'bottomleft'
  34. },
  35. onAdd: function (map) {
  36. var container = L.DomUtil.create('div', 'ufo_error_div leaflet-control-layers leaflet-control-layers-expanded')
  37. return container;
  38. }
  39. });
  40. var UfoStatClass = L.Control.extend({
  41. options: {
  42. position: 'bottomleft'
  43. },
  44. onAdd: function (map) {
  45. var container = L.DomUtil.create('div', 'ufo_stat_div leaflet-control-layers leaflet-control-layers-expanded')
  46. L.DomEvent.on(container,'mousedown',L.DomEvent.stopPropagation)
  47. .on(container,'doubleclick',L.DomEvent.stopPropagation)
  48. .on(container,'click',L.DomEvent.stopPropagation)
  49. return container;
  50. }
  51. });
  52. // leaflet cluster, regrouping zombies by country
  53. function Cluster(){
  54. this._clusters=new Array()
  55. this.add=function(zombie,marker){
  56. cc=zombie.country_code
  57. cg=false
  58. if(cc){
  59. cg=this.find(cc)
  60. if(cg==false){
  61. cg=new L.MarkerClusterGroup()
  62. this._clusters.push({"cc":cc,"z":zombie,"cg":cg})
  63. }
  64. cg.addLayer(marker)
  65. map.addLayer(cg)
  66. }
  67. }
  68. this.find=function(cc){
  69. for(c in this._clusters){
  70. if(this._clusters[c].cc==cc){
  71. return this._clusters[c].cg
  72. }
  73. }
  74. return false
  75. }
  76. }
  77. // Target object
  78. function Doll(name){
  79. this.name = name
  80. this.data=false
  81. this.latlong = false
  82. this.city = false
  83. this.country = false
  84. this.country_code = false
  85. this.asn = false
  86. this.ip = false
  87. this.hostname = false
  88. this.drawnLayers = new Array()
  89. this.show=function(){
  90. target_icon=L.icon({iconUrl:"data:image/png;base64,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",
  91. iconSize: [25, 41],
  92. iconAnchor: [13, 42],
  93. popupAnchor: [-3, -76],
  94. shadowUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=',
  95. shadowSize: [68, 95],
  96. shadowAnchor: [22, 94]
  97. })
  98. var marker = L.marker(this.latlong,{icon: target_icon})
  99. var popup = L.Popup({
  100. maxHeight: 50})
  101. var popupcontent = "<b>"+this.name+"</b>"
  102. +"<br />-------------<br />"
  103. +"Localisation: "+this.city+"/"+this.country
  104. +"<br/>"
  105. +"IP: "+this.ip+"<br/>"
  106. +"Hostname: "+this.hostname+"<br/>"
  107. +"ASN: "+this.asn+"<br/>"
  108. marker.bindPopup(popupcontent)
  109. this.drawnLayers.push(marker)
  110. map.addLayer(marker)
  111. }
  112. this.setData = function(data){
  113. this.data=data
  114. this.latlong = data[0]
  115. this.city = data[1]
  116. this.country = data[2]
  117. this.country_code = data[3]
  118. this.asn = data[4]
  119. this.ip = data[5]
  120. this.hostname = data[6]
  121. while(pending_fires.length>0){
  122. var z = pending_fires.shift()
  123. try { z.fire() } catch(e){}
  124. }
  125. }
  126. }
  127. var pending_fires = []
  128. // object for each zombie
  129. function zombieEntry(name,data){
  130. this.data=data
  131. this.name = name
  132. this.latlong = data[0]
  133. this.city = data[1]
  134. this.country = data[2]
  135. this.country_code = data[3]
  136. this.asn = data[4]
  137. this.ip = data[5]
  138. this.hostname = data[6]
  139. this.drawnLayers = new Array()
  140. this.index=0
  141. this.state='awakening'
  142. this.speed= 1000 // animation speed in ms
  143. this.cluster = false
  144. this.show=function(){
  145. if(this.state==='awakening'){
  146. this.state='awake'
  147. this.stop_anim=false
  148. this.drawMarker()
  149. }
  150. }
  151. this.drawMarker=function(){
  152. if(!zombie_icon)
  153. zombie_icon=L.icon({iconUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAABn0lEQVQoz4WSPUiVYRTHf3+9+PqxNERlQYOFRQbdQWwQJx2C4N4lgqYiUNwbozGCIEhqUBCSuwRFS4uTUxI01BAUhkkFLUESJYp/KU/LEV5ernXggfPxnN85zzmPaCOWHgCngC2gG/gGTBUR5l9iqdfSiqWhiv9Y+vv/B3hlqc/SIUtzabcsDWT8XTVHpeQ6cAlYAFbb8MeAk8BGEfGsXfXblo5aWrMUbc5W3ntczuso6YeBHmAAoDNY7gqudwZPM95jaRA4uB/gEzCa+r1axE1FnKtFzAFX0z8CDFn6nV1Nd1hasjQDzAPjefE0sAt8ATaBi+kfBvqBO0C9iJjF0llLke97Yum1pdhBPwPd30HrWW3F0nNLPyw1y8M7sgdI++U+Q1zN+IKlVhkwYWm3spFrleQbpdgVS9/37BrwEZClbaAAPgAblS2fKOkjwK+EDctSH9AEjifsQuprwDTwHjhTATaAr8AbWTLQBfwBZrKDA8AtYCnhDeBydjKbhR4B67I0VkS8sHQXOA/05grfFhGTlh4mZBP4nB+pDiwCjb/iorRmvUZYHQAAAABJRU5ErkJggg==",
  154. iconSize: [16, 15],
  155. iconAnchor: [8, 8],
  156. popupAnchor: [-3, -76]
  157. })
  158. var marker = L.marker(this.latlong,{icon:zombie_icon}) //,{icon: this.makeCustomMarker()})
  159. var popup = L.Popup({
  160. maxHeight: 50})
  161. var popupcontent = "<b>"+this.name+"</b>"
  162. +"<br />-------------<br />"
  163. +"Localisation: "+this.city+"/"+this.country+"<br/>"
  164. +"IP: "+this.ip+"<br/>"
  165. +"Hostname: "+this.hostname+"<br/>"
  166. +"ASN: "+this.asn+"<br/>"
  167. marker.bindPopup(popupcontent)
  168. cluster.add(this,marker)
  169. this.drawnLayers.push(marker)
  170. this.fire()
  171. }
  172. this.fire = function(){
  173. if(typeof doll === 'undefined' || !doll){
  174. return
  175. }
  176. if(doll.latlong){
  177. var src = this.latlong
  178. var dest = doll.latlong
  179. var b = new R.BezierAnim([src, dest])
  180. map.addLayer(b)
  181. this.drawnLayers.push(b)
  182. } else {
  183. pending_fires.push(this)
  184. }
  185. }
  186. this.makeCustomMarker= function(){
  187. if (this.index < this.counter_max){
  188. var customIcon = new L.icon({
  189. iconUrl: 'data:image/png;base64,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',
  190. iconSize: [30, 30], // size of the icon
  191. iconAnchor: [15, 15], // point of the icon which will correspond to marker's location
  192. popupAnchor: [-150, 50] // point from which the popup should open relative to the iconAnchor
  193. });
  194. }
  195. if (this.index == this.counter_max){
  196. var customIcon = new L.icon({
  197. iconUrl: 'data:image/png;base64,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',
  198. iconSize: [30, 30], // size of the icon
  199. iconAnchor: [15, 15], // point of the icon which will correspond to marker's location
  200. popupAnchor: [-150, 0] // point from which the popup should open relative to the iconAnchor
  201. });
  202. }
  203. return customIcon
  204. }
  205. this.makeClusterGroups=function(country_code_list){
  206. for (var i = 0; i < this.unique_country_code_list.length; i++){
  207. if (this.unique_country_code_list[i] == this.country_code_list[this.index]){
  208. if (this.clusterGroups[this.unique_country_code_list[i]]){
  209. //checks if a cluster for the country already exists
  210. return
  211. }
  212. else
  213. //if not make it.
  214. this.clusterGroups[this.unique_country_code_list[i]] = new L.MarkerClusterGroup();
  215. }
  216. }
  217. }
  218. this.AddMarkerCluster= function(marker){
  219. this.clusterGroups[this.country_code_list[this.index]].addLayer(marker)
  220. map.addLayer(this.clusterGroups[this.country_code_list[this.index]])
  221. this.drawnLayers.push(this.clusterGroups[this.country_code_list[this.index]])
  222. }
  223. this.AddMarker=function(src){
  224. var marker = L.marker([src[0], src[1]],{icon: this.makeCustomMarker()})
  225. this.drawnLayers.push(marker)
  226. }
  227. this.hide=function() {
  228. $('.header').hide()
  229. this.index =0
  230. this.state='awakening'
  231. this.stop_anim=true
  232. for (i in this.drawnLayers){
  233. if(map.hasLayer(this.drawnLayers[i]))
  234. map.removeLayer(this.drawnLayers[i])
  235. }
  236. this.drawnLayers=new Array()
  237. }
  238. }
  239. // List of zombies
  240. function Herd(){
  241. this.zombieEntries = new Array
  242. this.find=function (name){
  243. for (z in this.zombieEntries){
  244. if (this.zombieEntries[z].name === name){
  245. return this.zombieEntries[z]
  246. }
  247. }
  248. return false;
  249. }
  250. this.load=function(name){
  251. e=this.find(name)
  252. if(e){
  253. e.show()
  254. return
  255. }
  256. return false
  257. }
  258. this.hideAll = function(){
  259. for (ufoe in this.zombieEntries)
  260. this.zombieEntries[ufoe].hide()
  261. this.render()
  262. }
  263. this.hide = function(name){
  264. var ufoe=this.find(name)
  265. if(!ufoe) return
  266. ufoe.hide()
  267. this.render()
  268. }
  269. this.remove = function(name){
  270. for (z in this.zombieEntries){
  271. if(this.zombieEntries[z].name === name){
  272. this.zombieEntries[z].hide()
  273. this.zombieEntries.splice(z,1)
  274. this.render()
  275. return
  276. }
  277. }
  278. }
  279. this.add = function(name,data){
  280. var ufoe=this.find(name)
  281. if(!ufoe){
  282. ufoe=new zombieEntry(name,data)
  283. this.zombieEntries.push(ufoe)
  284. }
  285. ufoe.show()
  286. return ufoe
  287. }
  288. this.stop=function() {
  289. for(i=0;i<this.zombieEntries.length;i++) {
  290. this.zombieEntries[i].stop();
  291. }
  292. this.render()
  293. }
  294. this.count=function(){
  295. return this.zombieEntries.length
  296. }
  297. }
  298. // jquery shortcuts
  299. function ufomsg(msg){
  300. if ($('#ufomsg').html().indexOf(msg) == -1){
  301. $('#ufomsg').append(msg+"<br/>\n")
  302. $('#ufomsg_last').html(msg)
  303. }
  304. }
  305. function show_error(){
  306. $(".ufo_error_div").toggle()
  307. }
  308. function zombie_detail(data=''){
  309. t=''
  310. if (data!=''){
  311. t+="<h2>Zombie: <i>"+data.name+"</i> <a href='#' onclick='zombie_detail()'>X</a></h2>"
  312. t+=data.hits+" hits / "+data.retries+" retries / "+data.fails+" fails <br/>"
  313. t+=data.min_time+" min time / "+data.avg_time+" average time / "+data.max_time+" max time <br/>"
  314. t+=data.min_size+" min size / "+data.avg_size+" average size / "+data.max_size+" max size <br/>"
  315. }
  316. $('#zombie_detail').html(t)
  317. }
  318. // watchdog function
  319. function ufowatch(){
  320. // if attack mode we have a doll, and do a check if herd is done and bail if so
  321. // if herd is not done, get stats
  322. if(doll && !hdone){
  323. d = new Date()
  324. $("#ufostat").load("/js/ajax.js?stats="+d.getTime()).show()
  325. }
  326. // load doll geoip data
  327. if(doll && !doll.data)
  328. $(".ufo_error_div").load("/js/ajax.js?fetchdoll="+doll.name)
  329. // bail if all zombies are done in view mode
  330. if (zdone)
  331. return
  332. // we are not finished loading zombie geoip data, let's start...
  333. d=new Date
  334. var lw=d.getTime()
  335. error=''
  336. // basic check to prevent overload - relies on AJAX_DELAY variable
  337. if(last_watch < lw - AJAX_DELAY){
  338. last_watch=lw
  339. // loading next zombie
  340. $(".ufo_error_div").load('/js/ajax.js?zombie='+btoa(unescape(encodeURIComponent(last_zombie))))
  341. label=Zombies.count()+"/"+total_zombies
  342. if (Zombies.count()== total_zombies)
  343. label = total_zombies
  344. else
  345. if (Zombies.count() +dead_zombies.length== total_zombies){
  346. label=total_zombies
  347. if(dead_zombies.length>0){
  348. label=total_zombies -dead_zombies.length
  349. $('.ufo_error_div').html('<div id="ufo_error_div">To be discarded : <br/><ul>'
  350. +dead_zombies.join("<li> -")+'</ul></div>')
  351. error = "<a href='#' onclick='show_error()'> + "+dead_zombies.length+" not listed...</a>"
  352. }
  353. }
  354. $(".ufo_title_div").html('<div id="status"><center><h2><font color="red">Zombies:</font></h2><h3><font color="green" size="9px"><b>'+label+'</b></font></h3>'+error+'</center></div>');
  355. }
  356. }
  357. // (leaflet) map initialization
  358. function initMap (targetdoll=false) {
  359. if(map){
  360. return
  361. }
  362. if(targetdoll){
  363. doll=targetdoll
  364. }
  365. index = 0
  366. osm_sat = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png')
  367. map = L.map('map',{
  368. minZoom: 2,
  369. maxZoom: 7,
  370. zoomControl:false,
  371. layers: [osm_sat]
  372. });
  373. if (typeof latlong !== 'undefined') {
  374. map.setView(latlong[index], 1)
  375. }
  376. else{
  377. map.setView(new L.LatLng(0,0), 1)
  378. }
  379. osm_sat.addTo(map)
  380. var baseMaps = {
  381. "Light": osm_sat,
  382. }
  383. // initializing controls:
  384. new L.control.layers(baseMaps, null, {collapsed:false}).addTo(map)
  385. new L.Control.Zoom({position: 'topright'}).addTo(map)
  386. map.scrollWheelZoom.disable()
  387. map.addControl(new UfoControlClass())
  388. $('.ufo_msg_div').html("<h2 style='text-align:right'>Map Console <a href=\"#\" id='showMsg'>[+]</a> <a href=\"#\" id='hideMsg'>[-]</a></h2><div id='ufomsg'>[Info] [AI] [Control] Locating zombies... -> [Waiting!]<br/><br/></div><div id='ufomsg_last'>[Info] [AI] [Control] Locating zombies.... -> [Waiting!]<br/></div>")
  389. map.addControl(new UfoTitleClass())
  390. $(".ufo_title_div").html('<div id="status"><h2><font color="red">Zombies:</font></h2><center><h3><font color="green" size="9px"><b>'+total_zombies+'</b></font></h3></center></div>');
  391. map.addControl(new UfoErrorClass())
  392. $('.ufo_error_div').hide()
  393. map.addControl(new UfoStatClass())
  394. $('.ufo_stat_div').html("<h2 style='text-align:right'>Last Statistics <a href=\"#\" id='showStat'>[+]</a> <a href=\"#\" id='hideStat'>[-]</a></h2><div id='zombie_detail'></div><div id=\"ufostat\"></div>").hide()
  395. $('a#showStat').hide()
  396. $('a#showStat').click(function(){
  397. $('a#showStat').hide()
  398. $('a#hideStat').show()
  399. $('#ufostat').show()
  400. })
  401. $('a#hideStat').click(function(){
  402. $('a#hideStat').hide()
  403. $('a#showStat').show()
  404. $('#ufostat').hide()
  405. })
  406. $('a#hideMsg').hide()
  407. $('#ufomsg').hide()
  408. $('a#showMsg').click(function(){
  409. $('a#showMsg').hide()
  410. $('a#hideMsg').show()
  411. $('#ufomsg').show()
  412. $('#ufomsg_last').hide()
  413. })
  414. $('a#hideMsg').click(function(){
  415. $('a#hideMsg').hide()
  416. $('a#showMsg').show()
  417. $('#ufomsg').hide()
  418. $('#ufomsg_last').show()
  419. })
  420. // starting watchdog ajax request
  421. window.setInterval("ufowatch()",AJAX_DELAY)
  422. }
  423. // global variables
  424. var Zombies = new Herd()
  425. var cluster = new Cluster()
  426. var map = false
  427. var last_zombie = 'None'
  428. var zombie_icon = false
  429. d=new Date
  430. var last_watch = d.getTime()
  431. var target_icon = false
  432. var doll = false
  433. var dead_zombies = new Array()
  434. var errdiv = false
  435. var hdone = false
  436. var zdone = false
  437. var total_zombies=false