Статья Smcom - Скрипт для поиска установленных компонентов Joomla.

Joomla это наверное самый простой из самых распространённых web движков и наверное (от большей части) именно по этому большая часть "новоиспечённых" вебмастеров устанавливают Joomla и начинают свои первые шаги именно с неё.
Разумеется не имея опыта и знаний, но имея желание (а у кого то просто огромное) сделать свой сайт как можно более функциональным и как можно более красивым, практически все новички устанавливают просто кучу различных компонентов, плагинов, модулей, и прочих прелестей (для вебмастера) в свою новенькую Joomla.
Но как я уже сказал "не имея опыта и знаний" большая часть не может правильно их настроить или даже установить, от сюда и появляются уязвимости которыми могут воспользоваться злоумышфленники или "Исследователи"!
Правда бывают и исключения, бывают случаи когда вроде бы и опыт есть, и вроде знания какие-то имеются, но установив какой-то компонент сам того не подозревая вебмастер открывает брешь в своём ресурсе, так как этот самый компонент и имеет какую нибудь уязвимость.
Именно для поиска установленных компонентов и был написан этот скрипт, ведь зная какие компоненты установлены в Joomla можно пройтись по базам уязвимостей (вроде: ) и узнать в каком из установленных компонентов есть уязвимость.

Скрипт Show Me components Joomla написан на perl отсюда и его простота.
На данный момент скрипт умеет пробегаться по списку (comdb) компонентов и проверять их наличие на сайте, если есть возможность доступа к файлу с описанием, то выводит версию полное название и описание найденного компонента, при этом имеет возможность использование Proxy при соединении с сервером на котором располагается сайт.
Так же для удобства использования имеет некоторые опции настроек (которые в свою очередь будут добавляться).

Текущая версия скрипта 0.0.3, версия базы компонентов 0.0.2, текущие опции:
Код:
-с      Вывод только полезной информации, то есть выводит только обнаруженные компоненты.
-l      Запись результата сканирования в указанный файл.
-proxy  Для подключение будет использоваться указанный прокси (в случае с использованием tor это socks://localhost:9050)

Пример запуска скрипта:

Код:
Сканирование и вывод найденных и не найденных компонентов:

perl Smcom.pl -u https://site.en

Сканирование с использованием proxy для подключения:

perl Smcom.pl -u https://site.en -proxy socks://localhost:9050

Сканирование и вывод только найденных компонентов:

perl Smcom.pl -u https://site.en -с

Сканирование и запись результата в указанный файл:

perl Smcom.pl -u https://site.en -l /root/path/file_for_writen_result.txt


Пример вывода результата работы скрипта:


Код:
******************************************

*        Show me components Joomla!      *
 
*            Version: 0.0.3              *

*       Version Components DB: 0.0.2     *

*                by Centr                *

******************************************



 Show me components Joomla!
Detected Joomla! version(s) joomla.xml:2.5.11 [+]
Read version engine from file README.txt:*Joomla2.5 [+]
Read file robots.txt:[+]
# If the Joomla site is installed within a folder such as at
# e.g. www.example.com/joomla/ the robots.txt file MUST be
# moved to the site root at e.g. www.example.com/robots.txt
# AND the joomla folder name MUST be prefixed to the disallowed
# path, e.g. the Disallow rule for the /administrator/ folder
# MUST be changed to read Disallow: /joomla/administrator/
#
# For more information about the robots.txt standard, see:
# http://www.robotstxt.org/orig.html
#
# For syntax checking, see:
# http://www.sxw.org.uk/computing/robots/check.html

User-agent: *
Disallow: /administrator/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /images/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /libraries/
Disallow: /logs/
Disallow: /media/
Disallow: /modules/
Disallow: /plugins/
Disallow: /templates/
Disallow: /tmp/


Path administrator open.[+]
Detected Component Akeeba [+]
Detected Version(s): 3.6.12 [+] 
Description: Akeeba Backup Core - Full Joomla! site backup solution, Core Edition. [+] 

--------------------------------------------------
Detected Component com_banners [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_BANNERS_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_contact [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_CONTACT_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_content [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_CONTENT_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component jofacebookgallery [+]
Detected Version(s): 4.3 [+] 
Description: JO Facebook gallery version 4.3 for Joomla 1.6, 1.7, 2.5 installed successfully. This Component connect with facebook allows users manage albums and photos in Facebook embed to their site [+] 

--------------------------------------------------
Detected Component COM_K2 [+]
Detected Version(s): 2.6.6 [+] 
Description: Thank you for installing K2 by JoomlaWorks, the powerful content extension for Joomla! [+] 

--------------------------------------------------
Detected Component mailto

--------------------------------------------------
Detected Component com_media [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_MEDIA_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_newsfeeds [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_NEWSFEEDS_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_search [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_SEARCH_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_users [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_USERS_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component com_weblinks [+]
Detected Version(s): 2.5.0 [+] 
Description: COM_WEBLINKS_XML_DESCRIPTION [+] 

--------------------------------------------------
Detected Component wrapper

--------------------------------------------------


=======================================
End work!


Smcom.pl:
Код:
#!/usr/bin/perl
#-------------------------------------------
#Show Me components Joomla 
#Version: 0.0.3
#Version Components DB: 0.0.2
#Description:This script touches on components on the website with Joomla engine according to the list and shows result of search.
#Author: Centr
#link: https://codeby.net/members/centr.71419/
#___________________________________________

use WWW::UserAgent::Random;
use LWP::UserAgent;

my $f_base_com='comdb';

chomp @ARGV;

$banner=qq{
\n******************************************\n
*        Show me components Joomla!      *\n 
*            Version: 0.0.3              *\n
*       Version Components DB: 0.0.2     *\n
*                by Centr                *\n
******************************************\n\n
};
print $banner;
$logs=$banner;

unless(@ARGV){
	print "\n            Usage:perl Smcom.pl -u http://target.no [-c|-l]{-proxy} \n";
	print "\nExample:          perl Smcom.pl -u http://target.no -c \n";
	print "\nExample:          perl Smcom.pl -u http://target.no\n";
	print "\nExample:          perl Smcompl -h \n";
} elsif (@ARGV[0]=~/-h/) {
	
	print "\n            Usage:perl Smcom.pl -u http://target.no [-s] \n";
	print "\nExample: perl Smcom.pl -u http://target.no -c -l /root/com_name_site.txt \n";
	print "\nExample: perl Smcom.pl -u http://target.no -c -proxy socks://localhost:9050\n";
	print "\nExample: perl Smcom.pl -u http://target.no\n";
	print "\nExample: perl Smcom.pl -h \n";
	print "\n-----------------------------------------------------------------------\n";	
	print "\n-c    Not write not found component.\n";
	print "\n-l    Write log in you enter file.\n";
	print "\n-proxy  Set you proxy.n";
	print "\n-h      Print this help.\n";
} else {
		 

 for ($cA=0;$cA<@ARGV;$cA++){
	if ($ARGV[$cA] eq "-u"){ 
$url=$ARGV[$cA+1];
} elsif ($ARGV[$cA] eq "-s"){ 
$option=1;
} elsif ($ARGV[$cA] eq "-l"){ 
$logfile=$ARGV[$cA+1];
}elsif ($ARGV[$cA] eq "-proxy"){ 
$proxy=$ARGV[$cA+1];
}elsif ($ARGV[$cA] eq "-c"){ 
$cls=1;
}
}


   if (open(my $fbase, '<:encoding(UTF-8)', $f_base_com)) {
	   $logs=$logs."\n Show me components Joomla!\n";
	   print "\n Show me components Joomla!\n";
	 $content=get_page("$url/administrator/manifests/files/joomla.xml","",$proxy);

	 if($content){
		
	@jve=split("<version>",$content);
	($jov_j)=split("</version>",$jve[1]);
$logs=$logs."\n--------------------------------------------------\n"; 
	 $logs=$logs."Detected Joomla! version(s) joomla.xml:$jov_j [+]\n";
	 print "Detected Joomla! version(s) joomla.xml:$jov_j [+]\n";
 } else { 
	 print "\n--------------------------------------------------\n"; 
	 $logs=$logs."Not found file joomla.xml[!]\n"; 
	 print "Not found file joomla.xml[!]\n"; 
 }
	 $content=get_page($url."/README.txt","",$proxy);
	 if($content){
	 ($jv)=split("version history",$content);
	 @jve=split("www.joomla.org",$jv);
	 $jov_r=$jve[1];
	 $jov_r=~s/\n//g;
	 $jov_r=~s/ //g;
	  $logs=$logs."Read version engine from file README.txt:$jov_r [+]\n";
	 print "Read version engine from file README.txt:$jov_r [+]\n";
 } else { 
	 	  $logs=$logs."Not found file README.txt[!]\n";
	 print "Not found file README.txt[!]\n";  
 }
	
	 $content=get_page($url."/robots.txt","",$proxy);
	 if($content){
		 $logs=$logs."Read file robots.txt:[+]\n";
		 $logs=$logs."$content\n";
	 print "Read file robots.txt:[+]\n";
	 print "$content\n"; 
 } else { 
	 $logs=$logs."Not found file robots.txt[!]\n"; 
	 print "Not found file robots.txt[!]\n"; 
 } 
	 $content_host=get_page($url,"",$proxy);
	 $content=get_page($url."/administrator/components/com_cache/cache.xml","",$proxy); 
	 if($content ne $content_host){
	 $logs=$logs."Path administrator open.[+]\n";
	 print "Path administrator open.[+]\n";
	 $check_ver_com=1;
 } else { 
	 $logs=$logs."Path administrator closed[!]\n"; 
	 print "Path administrator closed[!]\n"; 
	
	 $check_ver_com=0;
 } 
	   
    while ($com = <$fbase>) {
		chomp $com;
		
     ($tmp,$name_com)=split("com_",$com);
    unless($cls){ 
		$logs=$logs."Tested: $name_com ";
		print "Tested: $name_com ";
		}
	 $content=get_page($url."/components/".$com."/".$name_com.".php","",$proxy);
	 if($content==1){
     if ($check_ver_com==1){ 
		$content2=get_page($url."/administrator/components/".$com."/".$name_com.".xml","",$proxy); 
		 if($content2){
	 @cve=split("<version>",$content2);
	 ($comp_version)=split("</version>",@cve[1]);
	 @cname=split("<name>",$content2);
	 ($comp_name)=split("</name>",@cname[1]);
	 @cdescrip=split("<description>",$content2);
	 ($comp_description)=split("</description>",@cdescrip[1]);
	}
}


	 if($comp_name){
		 $logs=$logs."Detected Component $comp_name [+]\n";
		print "Detected Component $comp_name [+]\n"; 
	 }else{
		 $logs=$logs."Detected Component $name_com\n";
	 print "Detected Component $name_com\n";
 }
	 if ($comp_version){ 
		 $logs=$logs."Detected Version(s): $comp_version [+] \n";
		 print "Detected Version(s): $comp_version [+] \n"; 
		 } 
	 if ($comp_description){ 
		 $logs=$logs."Description: $comp_description [+] \n";
		 print "Description: $comp_description [+] \n";
		  } 
	 $logs=$logs."\n--------------------------------------------------\n"; 
	 print "\n--------------------------------------------------\n"; 
 } elsif($content==2) { 
	 unless($cls){ 
	 $logs=$logs."Not found component[!]\n"; 
	 print "Not found component[!]\n"; 
 }
 } else { 
$logs=$logs."$content\n";  
print "Error $content\n";	 
 }
}
close $fbase; 
$logs=$logs."\n\n=======================================\nEnd work!\n";
print "\n\n=======================================\nEnd work!\n";

} else { print "Error open comdb!\n\n";}
if($logfile){
	if(open(my $flog, '>',$logfile)){
		print $flog $logs;
		close $flog;
	}else{ print "\nError open file: $logfile\n"; }	
}
}

sub get_page() 
{
my $link=$_[0];
my $agent=$_[1];
my $prox=$_[2];


my $ua = new LWP::UserAgent(agent => rand_ua($agent));
if ($prox){$ua->proxy([qw(http https)] => $prox);}
my $response = $ua->get($link);
if($response->code==200){
	$cont=$response->decoded_content;
if($cont){return $cont;}else{ return 1;}

} elsif($response->code==404){ 
	return 2; 
	 }else{ return $response->code,' ', $response->message,"\n";}
}

comdb:
Код:
com_vikappointments
com_5starhotels
com_akeeba
com_a6mambocredits
com_a6mambohelpdesk
com_aardvertiser
com_ab
com_abc
com_acajoom
com_acctexp
com_aceftp
com_aclassf
com_aclassfb
com_aclsfgpl
com_acooldebate
com_activities
com_actualite
com_acymailing
com_admin
com_adsmanager
com_advancedpoll
com_advert
com_affiliatetracker
com_agora
com_agoragroup
com_aicontactsafe
com_ajaxchat
com_akobook
com_akocomment
com_akogallery
com_alameda
com_alberghi
com_alfcontact
com_alfurqan
com_alfurqan15x
com_allcinevid
com_allhotels
com_alphacontent
com_alphauserpoints
com_altas
com_amblog
com_amocourse
com_annonces
com_answers
com_appointinator
com_artforms
com_article
com_articleman
com_articles
com_artist
com_artlinks
com_artportal
com_asortyment
com_astatspro
com_autartimonial
com_availcal
com_awd_song
com_awdwall
com_awesom
com_babackup
com_banners
com_bayesiannaivefilter
com_bazaar
com_bbs
com_bca-rss-syndicator
com_be
com_beamospetition
com_bearleague
com_beeheard
com_bfquiztrial
com_bfsurvey_profree
com_biblestudy
com_biblioteca
com_billyportfolio
com_bit
com_blog
com_blogfactory
com_bnf
com_bookflip
com_bookjoomlas
com_booklibrary
com_bookmarks
com_books
com_boss
com_br
com_breezingforms
com_brightweblinks
com_bsadv
com_bsq
com_bsqsitestats
com_bt_media
com_bulkenquery
com_calcbuilder
com_calendar
com_camelcitydb2
com_camp
com_candle
com_car
com_casino
com_casinobase
com_catalog
com_catalogproduction
com_catalogshop
com_category
com_catfiltering
com_cbe
com_ccboard
com_ccinvoices
com_cgtestimonial
com_chronoconnectivity
com_chronocontact
com_cinema
com_civicrm
com_cjlib
com_ckforms
com_clan
com_clanlist
com_clantools
com_clasifier
com_classifieds
com_clickheat
com_cloner
com_cmimarketplace
com_cmotour
com_cms
com_collector
com_colophon
com_color
com_colorlab
com_commedia
com_community
com_communitypolls
com_communityquiz
com_communitysurveys
com_competitions
com_comprofiler
com_connect
com_contact
com_contact_enhanced
com_contactformmaker
com_contactinfo
com_content
com_contenthistory
com_contentmap
com_contushdvideoshare
com_cpg
com_creativecontactform
com_crhotels
com_cropimage
com_crowdsource
com_custompages
com_cx
com_d3000
com_dadamail
com_dailymessage
com_dateconverter
com_datsogallery
com_dbquery
com_dcnews
com_delicious
com_detail
com_digifolio
com_digistore
com_dioneformwizard
com_directorix
com_directory
com_discussions
com_djartgallery
com_djcatalog
com_djiceshoutbox
com_dms
com_doc
com_docman
com_docmanpaypal
com_donateprocess
com_doqment
com_downloads
com_ds-syndicate
com_dshop
com_dtregister
com_dv
com_easy_youtube_gallery
com_easybook
com_easygb
com_ecommercewd
com_education
com_elite
com_elite_experts
com_emcomposer
com_enmasse
com_equipment
com_equotes
com_esearch
com_eshop
com_eslamiat
com_estateagent
com_event
com_eventbooking
com_eventing
com_eventix
com_eventlist
com_events
com_ewriting
com_expose
com_expshop
com_extcalendar
com_extended
com_extplorer
com_extplorer-test1
com_extplorer-test2
com_extplorer-test3
com_extrasearch
com_ezautos
com_ezine
com_ezstore
com_fabrik
com_facegallery
com_facileforms
com_fantasytournament
com_faq
com_fastball
com_feederator
com_filebase
com_filiale
com_fireboard
com_firmy
com_flash
com_flashfun
com_flashmagazinedeluxe
com_flippingbook
com_flipwall
com_flyspray
com_fm
com_foevpartners
com_foobla_suggestions
com_football
com_formmaker
com_formtool
com_forum
com_fq
com_fss
com_full
com_fundraiser
com_g2bridge
com_galeria
com_galleria
com_gallery
com_gallery_wd
com_galleryxml
com_game
com_gameq
com_gamesbox
com_gameserver
com_garyscookbook
com_genealogy
com_geoboerse
com_geocontent
com_gigcal
com_gk3_photoslide
com_gmaps
com_gnosis
com_golfcourseguid
com_golfcourseguide
com_googlebase
com_goverment
com_gpstools
com_graphics
com_grid
com_groovygallery
com_gsticketsystem
com_guide
com_guru
com_hashcash
com_hbooking
com_hbssearch
com_hdflvplayer
com_hello
com_helpdeskpro
com_hikasho
com_hmcommunity
com_hotproperties
com_hotproperty
com_hotspots
com_htmlarea3
com_huruhelpdesk
com_hwdvideoshare
com_icagenda
com_ice
com_idoblog
com_idvnews
com_ignitegallery
com_ijoomla
com_imagebrowser
com_img
com_imoti
com_informations
com_inneradmission
com_installer
com_inter
com_intranet
com_ionfiles
com_iproperty
com_is
com_ixxocart
com_jabode
com_jacomment
com_jashowcase
com_javoice
com_jb2
com_jbpeople
com_jbudgetsmagic
com_jbusinessdirectory
com_jcafe
com_jcalpro
com_jce
com_jcommunity
com_jcruisereservation
com_jcs
com_jd-wiki
com_jd-wp
com_jdirectory
com_jeajaxeventcalendar
com_jeauction
com_jeauto
com_jeawdsong
com_jeclassifyads
com_jedirectory
com_jeemasms
com_jefaqpro
com_jeformcr
com_jegallery
com_jegridfolio
com_jeguestbook
com_jejob
com_jek2storymultipleform
com_jem
com_jemessenger
com_jepoll
com_jeportfolio
com_jepropertyfinder
com_jequizmanagement
com_jequoteform
com_jesectionfinder
com_jesubmit
com_jeticket
com_jetour
com_jevideorate
com_jfbconnect
com_jfuploader
com_jgen
com_jgrid
com_jhotelreservation
com_jim
com_jimtawl
com_jinc
com_jjgallery
com_jmarket
com_jmovies
com_jmsfileseller
com_jnews
com_jnewsletter
com_jobgrokapp
com_jobline
com_jobprofile
com_jofacebookgallery
com_joltcard
com_jombib
com_jomdirectory
com_jomestate
com_jomres
com_jomtube
com_joobb
com_joodb
com_jooget
com_joom12pic
com_joomblog
com_joomdle
com_joomdoc
com_joomdocs
com_joomgalaxy
com_joominaflileselling
com_joomla
com_joomla-visites
com_joomlaboard
com_joomladate
com_joomlaflashfun
com_joomlalib
com_joomlaradiov5
com_joomlaupdate
com_joomlavvz
com_joomlaxplorer
com_joomloads
com_joomloc
com_joomlub
com_joomnik
com_joomradio
com_joomsport
com_joomtouch
com_joomtracker
com_jooproperty
com_joovideo
com_jotloader
com_journal
com_jp_jobs
com_jpack
com_jpad
com_jphone
com_jradio
com_jreactions
com_jreservation
com_jreviews
com_jscalendar
com_jsjobs
com_jsplocation
com_jstore
com_jsubscription
com_jsupport
com_jtagcalendar
com_jtickets
com_jumi
com_juser
com_jvcomment
com_jvehicles
com_jvideo
com_jvideoclip
com_jvideodirect
com_jvotesystem
com_k2
com_k2ajaxsearch
com_k2store
com_kbase
com_knowledgebase
com_kochsuite
com_komento
com_konsultasi
com_kp
com_ksadvertiser
com_kunena
com_kunena_google_map_no_geocode
com_lead
com_letterman
com_lexikon
com_linkdirectory
com_listbingo
com_listing
com_listoffreeads
com_livechat
com_liveticker
com_lm
com_lmo
com_lms
com_loudmounth
com_loudmouth
com_lovefactory
com_lowcosthotels
com_lucygames
com_lurm
com_macgallery
com_machine
com_mad4joomla
com_madeira
com_magicdealsweb
com_maian15
com_maianmedia
com_maianmusic
com_mailarchive
com_mailto
com_mambatstaff
com_mambelfish
com_mambospgm
com_mambowiki
com_maqmahelpdesk
com_marketplace
com_markt
com_matamko
com_mcquiz
com_mdigg
com_media
com_mediaslide
com_mediqna
com_memorix
com_mezun
com_mgm
com_minibb
com_misterestate
com_mmp
com_model
com_moodle
com_moofaq
com_mosets
com_mosforms
com_mosmedia
com_mospray
com_mosres
com_most
com_motor
com_movm
com_mp3
com_mscomment
com_mtree
com_multibanners
com_muscol
com_music
com_myalbum
com_myblog
com_mycar
com_mycontent
com_mydyngallery
com_myform
com_mygallery
com_myhome
com_mymsg
com_mysms
com_mytube
com_n-forms
com_na
com_neogallery
com_neorecruit
com_neoreferences
com_netinvoice
com_news
com_newsfeeds
com_newsflash
com_nfn
com_niceajaxpoll
com_nicetalk
com_nkc
com_noticeboard
com_noticias
com_novasfh
com_ob
com_obsuggest
com_odudeprofile
com_omnirealestate
com_omphotogallery
com_onevote
com_ongallery
com_ongumatimesheet20
com_onismusic
com_onispetitions
com_onisquotes
com_onlineflashquiz
com_ornekek
com_osproperty
com_osservicesbooking
com_ownbiblio
com_oziogallery
com_oziogallery2
com_pandafminigames
com_panoramic
com_parcoauto
com_paxgallery
com_paxxgallery
com_payplans
com_pbbooking
com_pcchess
com_pccookbook
com_people
com_peoplebook
com_performs
com_philaform
com_phocadocumentation
com_phocagallery
com_phocamaps
com_photo
com_photomapgallery
com_php
com_phpshop
com_picasa2gallery
com_picsell
com_pinboard
com_pms
com_poll
com_pollxt
com_ponygallery
com_portafolio
com_portfol
com_portfoliogallery
com_poweradmin
com_prayercenter
com_pro
com_pro_desk
com_prod
com_product
com_products
com_productshowcase
com_profile
com_profiler
com_projectfork
com_properties
com_propertylab
com_puarcade
com_publication
com_publisher
com_qcontacts
com_qpersonel
com_question
com_quiz
com_quran
com_rand
com_rapidrecipe
com_rdautos
com_realestatemanager
com_realtyna
com_recly
com_record
com_redshop
com_referenzen
com_registrationpro
com_rekry
com_remository
com_reporter
com_reservations
com_resman
com_restaurante
com_restaurantguide
com_ricette
com_rokdownloads
com_rokmodule
com_rpl
com_rsappt_pro2
com_rsappt_pro3
com_rsbook_15
com_rsfiles
com_rsgallery
com_rsgallery2
com_rss
com_rssreader
com_rssxt
com_rwcards
com_s5clanroster
com_sanpham
com_sar_news
com_school
com_search
com_searchlog
com_sebercart
com_sectionex
com_securityimages
com_sef
com_seminar
com_serverstat
com_sexypolling
com_seyret
com_sg
com_showdown
com_simple
com_simpleboard
com_simpledownload
com_simplefaq
com_simpleimageupload
com_simplephotogallery
com_simpleshop
com_simpleswfupload
com_sitemap
com_slider
com_slideshow
com_smartsite
com_smf
com_sobi2
com_soccerbet
com_socialads
com_some
com_spa
com_spidercalendar
com_spidercatalog
com_spiderfacebook
com_spiderfaq
com_spielothek
com_sponsorwall
com_sportspredictions
com_staticxt
com_store
com_surveymanager
com_swmenupro
com_szallasok
com_tag
com_team
com_teamdisplay
com_tech
com_techfolio
com_thopper
com_threate
com_thyme
com_tickets
com_timereturns
com_timetrack
com_tophotelmodule
com_topics
com_tour
com_tpdugg
com_tpjobs
com_trade
com_treeg
com_ttvideo
com_turtushout
com_uhp
com_uhp2
com_ultimateportfolio
com_user
com_userextranet
com_users
com_utchat
com_vehiclemanager
com_versioning
com_videodb
com_videoflow
com_videogallery
com_videogallerylite
com_vikbooking
com_virtuemart
com_visa
com_volunteer
com_vr
com_waticketsystem
com_wdsubscriptions
com_webhosting
com_weblinks
com_webring
com_wire_immogest
com_wmt_content_timeline
com_wmtgallery
com_wmtpic
com_wmtportfolio
com_worldrates
com_wrapper
com_x-shop
com_xball
com_xcloner-backupandrestore
com_xcomp
com_xevidmegahd
com_xewebtv
com_xfaq
com_xgallery
com_xmap
com_xmovie
com_xsstream-dm
com_xvs
com_ybggal
com_yellowpages
com_yjcontactus
com_ynews
com_youtube
com_youtubegallery
com_yvcomment
com_zcalendar
com_zelig
com_zina
com_zoom
com_zoomportfolio
com_ztautolink
[doublepost=1489767339,1489740177][/doublepost]Текущая версия скрипта 0.1.5, версия базы компонентов 0.0.3, текущие опции:
Код:
-с      Вывод только полезной информации, то есть выводит только обнаруженные компоненты.
-l      Запись результата сканирования в указанный файл.
-proxy  Для подключение будет использоваться указанный прокси (в случае с использованием tor это socks://localhost:9050)
-ss     Для обладателей Kali-Linux добавлена возможность искать сплоит в локальной базе exploit-db, используется "searchsploit".
-secj   Поиск компонента на сайтах с базами уязвимостей через ресурс sec.jetlib.com

Пример запуска скрипта:

Код:
Сканирование и вывод найденных и не найденных компонентов:

perl Smcom.pl -u https://site.en

Сканирование с использованием proxy для подключения:

perl Smcom.pl -u https://site.en -proxy socks://localhost:9050

Сканирование и вывод только найденных компонентов:

perl Smcom.pl -u https://site.en -с

Сканирование и запись результата в указанный файл:

perl Smcom.pl -u https://site.en -l /root/path/file_for_writen_result.txt

Сканирование и поиск компонента среди локальной базы exploit-db используя searchsploit

perl Smcom.pl -u https://site.en -ss 

Сканирование и поиск компонента на сайтах с базами уязвимостей используя ресурс sec.jetlib.com 

perl Smcom.pl -u https://site.en -secj
 

Вложения

  • Нравится
Реакции: Сергей Попов
Вы про github слышали? Исходники в архиве это моветон в 2017 году.
 
Вы про github слышали? Исходники в архиве это моветон в 2017 году.
Нет, не видел!
Мне вот захотелось его разместить именно здесь, с архивом конечно погарячился не много, но и вреда от него ни какого, хочется скачай, посмотри\улыбнись, не хочется пройди мимо, заюзай с того же гита joomscan.
 
С временем в последние время небольшой напряг (работа\природа\шашлык/башлык\ да и поспать ни разу не-не...), в общем выкрапил для "Апгрёйда" скрипта пару часиков...
Итог:
Добавил возможность указывать маску для заголовка UserAgent.
Добавил возможность рыскать имена компонентов по всему сайту перебирая все линки которые только возможно обнаружить.
Добавил простой сканер на уязвимые параметры при поиске компонентов по всему сайту, будет каждую найденную ссылку пробовать на любимую "кавычельку", каждый параметр найденной линки.
Немного переделал запись лога, в принципе всё так же... просто теперь можно указать только директорию в которой будет производиться запись лога, скрипт сам создаст отдельную папку в которой будет писать логи, если папку не указывать то создаться папка в директории где располагается сам скрипт.

Вроде бы всё, время позднее и не много мысли разбигаются, если что забыл дополню в следующий раз.

текущая версия скрипта 1.2.9 beta, версия базы компонентов 0.0.3, текущие опции:

Код:
-с               Вывод только полезной информации, то есть выводит только обнаруженные компоненты.
--log            Запись результата сканирования в указанную директорию.
--proxy          Для подключение будет использоваться указанный прокси (в случае с использованием tor это socks://localhost:9050)
-ss              Для обладателей Kali-Linux добавлена возможность искать сплоит в локальной базе exploit-db, используется "searchsploit".
-secj            Поиск компонента на сайтах с базами уязвимостей через ресурс sec.jetlib.com 
-i               Перебор компонентов из локальной базы (comdb)
-a               Поиск компонентов по всему сайту.
    -v           Указав параметр "-a" можно использовать простой сканер уязвимых параметров.
--user-agent     Указать маску заголовка "UserAgent", будет использоваться рандомнный вариант из указанной маски.
---------------------------------------------------
Доступные маски:
#amiga
#beos
#browsers
#cloud_platforms
#consoles
#crawlers
#feed_readers
#freebsd
#link_checkers
#linux
#macintosh
#netbsd
#openbsd
#os2
#others
#phones
#proxy
#shell
#sunos
#tool
#validators
#wap
#windows

Подробнее можно узнать здесь https://metacpan.org/pod/WWW::UserAgent::Random


Пример запуска скрипта:

Код:
Сканирование и вывод найденных и не найденных компонентов, перебор из локальной базы:

perl Smcom.pl -u https://site.en -i

Сканирование с использованием proxy для подключения, поиск компонентов по всему сайту:

perl Smcom.pl -u https://site.en -a --proxy socks://localhost:9050

Сканирование и вывод только найденных компонентов, перебор из локальной базы:

perl Smcom.pl -u https://site.en -i -c

Сканирование и запись результата в указанной директории:

perl Smcom.pl -u https://site.en --log /root/path/dir_for_result/

Сканирование и поиск компонента среди локальной базы exploit-db используя searchsploit, перебор из локальной базы: 

perl Smcom.pl -u https://site.en -i -ss 

Сканирование и поиск компонента на сайтах с базами уязвимостей используя ресурс sec.jetlib.com, перебор из локальной базы:

perl Smcom.pl -u https://site.en -i -secj 

Сканирование и поиск компонентов по всему сайту, по ходу сканировать на уязвимость в параметрах ссылок:

perl Smcom.pl -u https://site.en -a -v 

Сканирование и поиск компонентов из локальной базы используя для подключения маску для заголовка UserAgent:

perl Smcom.pl -u https://site.en -i --user-agent linux

Конечно всё только начинается и всё впереди, пожелания\замечания приветствуются.

P.s. Кому интересны обновления и дополнения заглядывайте в этот топик почаще.
[doublepost=1490558323,1490372862][/doublepost]текущая версия 1.2.16e beta

Оптимизирован результат выдачи простого сканера на уязвимые параметры.
В место тулзы searchsploit используется локальный поиск в файлах базы exploit-db, что даёт более точный результат.
Код:
perl Smcom.pl -u http://target.io -i -sl -a -v -c

Для остановки работы скрипты нажмите enter в консоле и не много подождите (возможно потребуется нажаться пару раз).

Код:
#!/usr/bin/perl
#-------------------------------------------
#Show Me components Joomla 
#Version: 1.2.16e beta
#Version Components DB: 0.0.3
#Description:This script touches on components on the website with Joomla engine according to the list and shows result of search.
#Author: Centr
#link: https://codeby.net/members/centr.71419/
#___________________________________________

use WWW::UserAgent::Random;
use LWP::UserAgent;
use HTTP::Request;
use HTML::Entities;
use File::Spec;
use URI::Escape;

my ($check_ver_com);
my $f_base_com='comdb';

chomp @ARGV;

$banner=qq{
\n******************************************\n
*        Show me components Joomla!      *\n 
*            Version: 1.2.16e beta         *\n
*       Version Components DB: 0.0.3     *\n
*                by Centr                *\n
******************************************\n\n
};

$p_example=qq{
\nUsage:perl Smcom.pl -u http://target.no [-i|-a [-v]] [-c|-secj|-sl][--log /path/]{--proxy|--user-agent} \n
\nExample:\nperl Smcom.pl -u http://target.no -c -a\n
-Example:\nperl Smcom.pl -u http://target.no -c -i -secj -sl \n
-Example:\nperl Smcom.pl -u http://target.no -i \n
-Example:\nperl Smcom.pl -u http://target.no -c -a -v \n
-Example:\nperl Smcom.pl -u http://target.no -c -secj -sl -a -v -i\n
-Example:\nperl Smcom.pl -u http://target.no -i -a -v\n
-Example:\nperl Smcom.pl -u http://target.no -c -i --proxy socks://localhost:9050\n
-Example:\nperl Smcom.pl -u http://target.no -c -i --user-agent windows\n
-Example:\nperl Smcom.pl -u http://target.no -c -a --log /path/dir_for_log\n
-Example:\nperl Smcompl -h \n
};

$s_help=qq{
\n-i             Search of components from a local basis (comdb).\n
\n-a             Search of components in all website.\n
\n   -v          Simple scanner of vulnerable parameters.\n
\n-c             To write about the found components.\n
\n--log          To write a log to the specified directory.\n
\n--proxy        Set you proxy.\n
\n--user-agent   Set mask header user-agent.\n
\n-secj          Search component in http://sec.jetlib.com. \n
\n-sl            Search component in local database exploit-db(only in kaliLinux).\n
\n-h             Print this help.\n
\n-----------------------------------------------------------------------\n	
};



print $banner;
$logs=$banner;

unless(@ARGV){
	print $p_example;
} elsif (@ARGV[0]=~/-h/) {
print $s_help;
print $p_example;
} else {
		 

 for ($cA=0;$cA<@ARGV;$cA++){
	if ($ARGV[$cA] eq "-u"){ 
$url=$ARGV[$cA+1];
} elsif ($ARGV[$cA] eq "-i"){ 
$search_list=1;
} elsif ($ARGV[$cA] eq "--log"){ 
$logdir=$ARGV[$cA+1];
}elsif ($ARGV[$cA] eq "--proxy"){ 
$proxy=$ARGV[$cA+1];
}elsif ($ARGV[$cA] eq "-c"){ 
$cls=1;
}elsif ($ARGV[$cA] eq "--user-agent"){ 
$agent=$ARGV[$cA+1];
}elsif ($ARGV[$cA] eq "-a"){ 
$search_all_link=1;
}elsif ($ARGV[$cA] eq "-v"){ 
$search_all_vuln=1;
}elsif ($ARGV[$cA] eq "-secj"){ 
$use_secj=1;
}elsif ($ARGV[$cA] eq "-sl"){ 
$use_sl=1;
}
}

 ($protocol,$host_name)=split(';',get_host_name($url));

	 $logs=$logs."Target URL: $url\n";
	 print "Target URL: $url\n";
	 
	 if($search_list){
	$option=$option."Search of components from a local basis (comdb).\n"
}
 if($search_all_link){
	$option=$option."Search of components in all website.\n"
}
 if($search_all_vuln){
	 $option=$option."Simple scanner of vulnerable parameters.\n"
}

 if($use_secj){
	 $option=$option."Search vuln for components in sec.jetlib.\n"
}

 if($use_ss){
	 $option=$option."Local db for search exploit.\n"
}

 if($proxy){
	 $option=$option."Use proxy ( $proxy )for connected.\n"
}

 if($agent){
	 $option=$option."Use UserAgent $agent.\n"
}

if ($option){
	 $logs=$logs."Option on: $option\n";
	 print "Option on: $option\n";
}

$content_host=get_page($url,$agent,$proxy);
echo_star();

if ($search_list){
   if (open(my $fbase, '<:encoding(UTF-8)', $f_base_com)) {
	      while ($com = <$fbase>) {
			  if(get_key()){
	print 'You want to stop execution of a script?(Yes[y]\No[n]):';$stp=<STDIN>;
if($stp=~/y/){
	last;
}
}
		chomp $com;
	   com_check($com);
   }
	  close $fbase; 
} else { print "Error open comdb!\n\n";}

}
}


if ($search_all_link){
	my $full_str=parse_link_from_content($content_host,$all_link,$all_link_other_host,$all_com,$all_file);
	
($all_link,$all_link_other_host,$all_com,$all_file)=split(/Smc0mo0oi0o0/ ,$full_str);

my ($tested_parametrs);
	
while(1){
	
my @one_ln=split("\n",$all_link);

for(my $n_ln=0;$n_ln<@one_ln;$n_ln++){
	if(get_key()){
	print 'You want to stop execution of a script?(Yes[y]\No[n]):';$stp=<STDIN>;
if($stp=~/y/){
	last;
}
}
	my $lin_q=quotemeta($one_ln[$n_ln]);
	unless($parses_link=~/$lin_q/i){	
my $content_one=get_page($one_ln[$n_ln],$agent,$proxy);

if($search_all_vuln){
if($one_ln[$n_ln]=~/\?/){
my $checkeds_r=checks_testes($one_ln[$n_ln],$tested_parameters);		
	my @arr_chekeds=split('-----',$checkeds_r);
	$tested_parameters=$arr_chekeds[1];
	if($arr_chekeds[0] eq 'no testes '){
		
		unless($cls){
	print "$one_ln[$n_ln] \n";
}
my $vuln_t_str=vuln_test($one_ln[$n_ln],$content_host);
if($vuln_t_str){
$result_vuln_test=$result_vuln_test.$vuln_t_str;
print "$vuln_t_str\n";
}
}
}
} 

my $full_string=parse_link_from_content($content_one,$all_link,$all_link_other_host,$all_com,$all_file);
($all_link,$all_link_other_host,$all_com,$all_file)=split(/Smc0mo0oi0o0/ ,$full_string);

$parses_link=$parses_link.$one_ln[$n_ln]."\n";

} 

			
}
my $all_link_n=split("\n",$all_link);
my $parses_ln_n=split("\n",$parses_link);
	if($parses_link eq $all_link){
		$logs=$logs.$result_vuln_test."\n";
		last;
		}elsif($stp =~/y/){
			$logs=$logs.$result_vuln_test."\n";
			last;
}
}	

}


$logs=$logs."\n\n=======================================\nEnd work!\n";
print "\n\n=======================================\nEnd work!\n";

	unless($logdir){
my $path_to_file = File::Spec->rel2abs($0); 
my @path = File::Spec->splitpath( $path_to_file );
			$logdir=$path.$host_name.'/';
		}else{
		$logdir=$logdir.$host_name.'/';	
		}	
		unless(-d $logdir){
			mkdir($logdir,0655);
			creat_log($logdir,$logs,$all_link,$all_link_other_host,$all_com,$all_file);
		}else{
		creat_log($logdir,$logs,$all_link,$all_link_other_host,$all_com,$all_file);
		}

sub creat_log()
{
my $ldir=$_[0];
my $ls=$_[1];
my $all_ls=$_[2];
my $all_link_other_host_s=$_[3];
my $all_com_s=$_[4];
my $all_file_s=$_[5];
	
my $log_file=$ldir.'Logs_works.txt';	
cr_f($log_file,$ls);	

if($all_ls){
my $f_all_link=$ldir.'All_link.txt';
cr_f($f_all_link,$all_ls);
}
if($all_link_other_host_s){
my $f_all_link_other_host_s=$ldir.'All_link_other_site.txt';
cr_f($f_all_link_other_host_s,$all_link_other_host_s);
}
if($all_com_s){
my $f_all_com_s=$ldir.'All_components.txt';
cr_f($f_all_com_s,$all_com_s);	
}
if ($all_file_s){
my $f_all_file_s=$ldir.'All_files.txt';
cr_f($f_all_file_s,$all_file_s);
}

}	

sub cr_f()
{
my $file=$_[0];
my $text=$_[1];

if(open(my $flog, '>',$file)){
		print $flog $text;
		close $flog;
	}else{ print "\nError open file: $file\n"; }	
	
}


sub echo_star()
{
my ($content);	
$content=get_page("$url/administrator/manifests/files/joomla.xml",$agent,$proxy);

	 if($content){
		
	@jve=split("<version>",$content);
	($jov_j)=split("</version>",$jve[1]);
$logs=$logs."\n--------------------------------------------------\n"; 
	 $logs=$logs."Detected Joomla! version(s) joomla.xml:$jov_j [+]\n";
	 print "Detected Joomla! version(s) joomla.xml:$jov_j [+]\n";
 } else { 
	 print "\n--------------------------------------------------\n"; 
	 $logs=$logs."Not found file joomla.xml[!]\n"; 
	 print "Not found file joomla.xml[!]\n"; 
 }
	 $content=get_page($url."/README.txt",$agent,$proxy);
	 if($content){
	 ($jv)=split("version history",$content);
	 @jve=split("www.joomla.org",$jv);
	 $jov_r=$jve[1];
	 $jov_r=~s/\n//g;
	 $jov_r=~s/ //g;
	  $logs=$logs."Read version engine from file README.txt:$jov_r [+]\n";
	 print "Read version engine from file README.txt:$jov_r [+]\n";
 } else { 
	 	  $logs=$logs."Not found file README.txt[!]\n";
	 print "Not found file README.txt[!]\n";  
 }
	
	 $content=get_page($url."/robots.txt",$agent,$proxy);
	 if($content){
		 $logs=$logs."Read file robots.txt:[+]\n";
		 $logs=$logs."$content\n";
	 print "Read file robots.txt:[+]\n";
	 print "$content\n"; 
 } else { 
	 $logs=$logs."Not found file robots.txt[!]\n"; 
	 print "Not found file robots.txt[!]\n"; 
 } 
	 
	 $content=get_page($url."/administrator/components/com_cache/cache.xml",$agent,$proxy); 
	 if($content ne $content_host){
	 $logs=$logs."Path administrator open.[+]\n\n";
	 print "Path administrator open.[+]\n\n";
	 $check_ver_com=1;
 } else { 
	 $logs=$logs."Path administrator closed[!]\n\n"; 
	 print "Path administrator closed[!]\n\n"; 
	
	 $check_ver_com=0;
 } 	
}
		

sub parse_link_from_content()
{
	
my $content_parse=$_[0];
my $all_lin=$_[1];
my $all_link_other_hosts=$_[2];
my $all_coms=$_[3];
my $all_files=$_[4];
my @content_str=split("\n", $content_parse);
my $count_str=@content_str;
my ($linker_host_name_t,@linker_host_name,$linker);
scalar $count_str;

for(my $c_str=0;$c_str<$count_str;$c_str++){
	
if($content_str[$c_str]=~/com_/){
my @com_str=split('com_',$content_str[$c_str]);
my $count_com=@com_str;
scalar $count_com;
for (my $c_com=1;$c_com<$count_com;$c_com++){
my ($tmp_str)=split(/([^a-zA-Z0-9_-])/,$com_str[$c_com]);
if($tmp_str=~/([a-zA-Z0-9_-])/){
	my $tmp_strq=quotemeta(decode_entities($tmp_str));
unless($all_coms=~/$tmp_strq/){
	unless($com_checks=~/$tmp_strq/){
	com_check('com_'.$tmp_str);
$all_coms=$all_coms.'com_'.$tmp_str."\n";
}
}
}
}	
}
	if ($content_str[$c_str]=~/href=/){
$linker=get_link('href=',$content_str[$c_str]);
}
if ($content_str[$c_str]=~/src=/){
$linker=get_link('src=',$content_str[$c_str]);
}	
if($linker){
	
	my @c_linker=split('\|',$linker);
	for(my $uy=0;$uy<@c_linker;$uy++){
$linker_host_name_t=get_host_name($c_linker[$uy]);
 @linker_host_name=split(';',$linker_host_name_t);
	if($linker_host_name[1] eq $host_name or $linker_host_name[1] eq 'www.'.$host_name){###
		my $linkerq=quotemeta(decode_entities($c_linker[$uy]));
		my $ln_rev=reverse($c_linker[$uy]);
my ($ln_rev_ex)=split('\.',$ln_rev);
my $ln_ex=reverse($ln_rev_ex);
	if($ln_ex=~/(ico)|(css)|(png)|(jpg)|(jpeg)|(gif)|(mp3)|(flv)|(mp4)|(pdf)|(tar)|(gz)|(gzip)|(rar)|(zip)/i){
		unless($all_files=~/$linkerq/i){
	$all_files=$all_files.$c_linker[$uy]."\n";
}	
	}else{	
				
		unless($all_lin=~/$linkerq/){
$all_lin=$all_lin.$c_linker[$uy]."\n";
}
}
}else{
	my $linkerq=quotemeta(decode_entities($c_linker[$uy]));
unless($all_link_other_hosts=~/$linkerq/){	
$all_link_other_hosts=$all_link_other_hosts.$c_linker[$uy]."\n";	
}
}	
}
}
}	
return $all_lin.'Smc0mo0oi0o0'.$all_link_other_hosts.'Smc0mo0oi0o0'.$all_coms.'Smc0mo0oi0o0'.$all_files;	
}	


sub get_link()
{
my $tag=$_[0];
my $str_l=$_[1];
my 	($linker,$linkers);

my @linker_str=split($tag,$str_l);
my $count_link=@linker_str;
scalar $count_link;

for (my $c_link=1;$c_link<$count_link;$c_link++){
	my $delimetr=substr($linker_str[$c_link],0,1);
	my $delimetrq=quotemeta($delimetr);
my @linker=split($delimetrq,$linker_str[$c_link]);
my @lin_d=split('/',$linker[1]);
if($linker[1]=~/([a-zA-Z0-9-])/){
unless($lin_d[0]=~/([a-zA-Z0-9-]).(a-zA-z)/ or $lin_d[0]=~/http/){
my $firstsimbol=substr($linker[1],0,1);
if($firstsimbol eq '/'){
$linker=$protocol.'//'.$host_name.decode_entities($linker[1]);
}else{
$linker=$protocol.'//'.$host_name.'/'.decode_entities($linker[1]);
}
} else {	
$firsts_simb=substr($linker[1],0,6);
unless(($firsts_simb eq 'https:') or ($firsts_simb eq 'http:/')){
$linker=$protocol.'//'.decode_entities($linker[1]);	
} else {

$linker=decode_entities($linker[1]);
}		
}
$linkers=$linkers.$linker.'|'; 
}
}	
return $linkers;
	
}
		
sub com_check()
{
	my $com=shift;
	local $com_checks;
     ($tmp,$name_com)=split("com_",$com);
    unless($cls){ 
		$logs=$logs."Tested: $name_com ";
		print "Tested: $name_com ";
		}
	 $content=get_page($url."/components/".$com."/".$name_com.".php","",$proxy);
	 if($content==1){
     if ($check_ver_com==1){ 
		$content2=get_page($url."/administrator/components/".$com."/".$name_com.".xml","",$proxy); 
		 if($content2){
	 @cve=split("<version>",$content2);
	 ($comp_version)=split("</version>",@cve[1]);
	 @cname=split("<name>",$content2);
	 ($comp_name)=split("</name>",@cname[1]);
	 @cdescrip=split("<description>",$content2);
	 ($comp_description)=split("</description>",@cdescrip[1]);
	}
}


	 if($comp_name){
		 $logs=$logs."Detected Component $comp_name [+]\n";
		print "Detected Component $comp_name [+]\n"; 
	 }else{
		 $logs=$logs."Detected Component $name_com\n";
	 print "Detected Component $name_com\n";
 }
	 if ($comp_version){ 
		 $logs=$logs."Detected Version(s): $comp_version [+] \n";
		 print "Detected Version(s): $comp_version [+] \n"; 
		 } 
	 if ($comp_description){ 
		 $logs=$logs."Description: $comp_description [+] \n";
		 print "Description: $comp_description [+] \n";
		  } 
	 $logs=$logs."\n--------------------------------------------------\n"; 
	 print "\n--------------------------------------------------\n"; 
	 

     if ($use_sl==1){

		 my $localdb=search_local_db('/usr/share/exploitdb/platforms/php/webapps',$com);
		 my $localdb2=search_local_db('/usr/share/exploitdb/platforms/multiple/webapps',$com);
	$logs=$logs."Search local exploit-db:\n $localdb \n $localdb2\n";
	print "Search local exploit-db:\n $localdb \n $localdb2\n";
	}
	 
	 	 if($use_secj==1){
	my $result_jet='';
	my $jetlib_link = 'http://sec.jetlib.com/search.php?rss_query=joomla+'.$name_com.'&rss_query_match=and&state=both&rss_query_channel=-1&rss_order=date&rss_query_res_per_page=-1&rss_query_current_page=0';
    my $res_cont=post_get($jetlib_link,$proxy,'linux');

   ($text_jet,$code_jet,$message_jet)=split('Responsesesessss:',$res_cont);
   if ($text_jet){
  $result_jet=parse_jetlib($text_jet,$name_com);
  if($result_jet){
   $logs=$logs."Jetlib:\n".$result_jet."\n";
   print "Jetlib:\n".$result_jet."\n";
   }
   }else {
	   $logs=$logs."Error... plese see result conected:\n".$code_jet.' '.$message_jet."\n";
	   print "Error... plese see result conected:\n".$code_jet.' '.$message_jet."\n";
	   }	 
		 
	}
	 
	 print "\n___________________________________________________\n"; 
	 $com_checks=$com_checks.$com."\n";
 } elsif($content==2) { 
	 unless($cls){ 
	 $logs=$logs."Not found component[!]\n"; 
	 print "Not found component[!]\n"; 
 }
 $com_checks=$com_checks.$com."\n";
 } else { 
$logs=$logs."$content\n";  
print "Error $content\n";	 
 }	
 
}		
	
sub search_local_db()                 
{
	my $dir=$_[0];
	my $text=$_[1];
	my $file_list;
 opendir(DIR, $dir);
my @files = readdir(DIR);
closedir(DIR);
 
foreach my $file (@files) {
    next if ($file eq "." or $file eq "..");
   my $full_file=$dir.'/'.$file;
    if (open(my $fb, '<:encoding(UTF-8)', $full_file)) {
	while (my $str = <$fb>) {	
			if($str=~/$text/i){ 
		  $file_list=$file_list."$full_file\n";
		  last;
		  }  
      }  
  close $fb;
  
  }	
  
}
return $file_list;
}
	
sub checks_testes()
{
 my $ln_for_test=$_[0];
 my $tested_parametrs=$_[1]; 
my ($testes_param);


my @op=split('\?',$ln_for_test);
if($op[1]=~/\&/){
my @parametrs=split('\&',$op[1]);

for(my $n_p=0;$n_p<@parametrs;$n_p++){
my @par_var=split('=',$parametrs[$n_p]);	
$testes_param=$testes_param.$par_var[0].';';	
}
}else{	
my @param=split("=",$ln_for_test);
$testes_param=$testes_param.$param[1].';';		
}

if($tested_parametrs=~/$testes_param/i){
	return 'testes -----'.$tested_parametrs;
}else{
$tested_parametrs=$tested_parametrs.$testes_param.'---testes_param_smc---';
return 'no testes -----'.$tested_parametrs;	
}	
}	
		
sub vuln_test()
{
 my $ln_for_test=$_[0];
 my $index_source=$_[1];
my ($result,$par);
 my $source_page=get_page($ln_for_test,$agent,$proxy);

my @op=split('\?',$ln_for_test);
if($op[1]=~/\&/){
my @parametrs=split('\&',$op[1]);

for(my $n_p=0;$n_p<@parametrs;$n_p++){
my @par_var=split('=',$parametrs[$n_p]);
my $par=join('=',$par_var[0],$par_var[1]);
my $var=$par_var[1];	

 my $test_r=test_par($ln_for_test,$par,$var,$source_page,$index_source);
if($test_r){
$result=$result.$test_r;
}

}

}else{	
my @param=split("=",$ln_for_test);
my $par=$param[1];

my $test_r=test_par($ln_for_test,$par,$par,$source_page,$index_source);
if($test_r){
$result=$result.$test_r;
}		
}

if($result){
	return $result;
}else{
	return 0;
}	
}

sub test_par()
{
my $ln_for_test=$_[0];
my $par=$_[1];
my $var=$_[2];
my $source_page=$_[3];
my $index_source=$_[4];

my ($test_result);

my $link=$ln_for_test;

if($var=~/([0-9])/){
	my $par_plus=$par.uri_escape('-1');
$link=~s/$par/$par_plus/i;	
my $source_page_t=get_page($link,$agent,$proxy);
if($source_page ne $source_page_t and $index_source ne $source_page_t){
$test_result=$test_result."Influence on parameter is possible: $par \n$ln_for_test\n";
}else{
	my $par_plus=$par.uri_escape('*2');
$link=~s/$par/$par_plus/i;	
my $source_page_t=get_page($link,$agent,$proxy);
if($source_page ne $source_page_t and $index_source ne $source_page_t){
$test_result=$test_result."Influence on parameter is possible: $par \n$ln_for_test\n";
}else{
   my $par_plus=$par.uri_escape('+and+1=2');
$link=~s/$par/$par_plus/i;	
my $source_page_t=get_page($link,$agent,$proxy);
if($source_page ne $source_page_t and $index_source ne $source_page_t){
$test_result=$test_result."Influence on parameter is possible: $par \n$link\n";
}	
}
}
}		

my @exp_simbols=split("-exp-","'-exp-\"-exp-`-exp-/*-exp-+--+-exp-+group+by+2+--+-exp-+group+by+1000+--+");
for(my $ex_n=0;$ex_n<@exp_simbols;$ex_n++){
	my $lin=$ln_for_test;
	my $par_simbols=$par.uri_escape($exp_simbols[$ex_n]);
$lin=~s/$par/$par_simbols/i;

my $source_page_t=get_page($lin,$agent,$proxy);	
if($source_page ne $source_page_t and $index_source ne $source_page_t){
my $checks_res=check_vuln($source_page_t);

if($checks_res){
$test_result=$test_result."Result of testing of the link: \nParameter: $par\n Link:\n$lin\n$checks_res\n";	
}
}	
}	
if($test_result){
return $test_result;
}else{
return 0;
}		
}	

sub check_vuln()
{
my $source=shift;
my($answer);
if($source=~/([a-zA-Z0-9])/){
my @arr_sorce_str=split("\n",$source);

for(my $n_str=0;$n_str<@arr_sorce_str;$n_str++){
my $source_str=decode_entities($arr_sorce_str[$n_str]);

if($source_str=~m/You\shave\san\serror\sin\syour\sSQL\ssyntax/i or 
$source_str=~m/supplied\sargument\sis\snot\sa\svalid\sMySQL\sresult\sresource/i or 
$source_str=~m/Invalid\sargument\ssupplied\s\for/i or
$source_str=~m/Warning\smysql_fetch_assoc/i or
$source_str=~m/Warning\smysql_fetch_array/i or
$source_str=~m/Warning\smysql_num_rows/i or
$source_str=~m/Warning\ssession_start/i or
$source_str=~m/Warning\sgetimagesize/i or
$source_str=~m/Warning\sis_writable/i or
$source_str=~m/Warning\sUnknown/i or
$source_str=~m/Warning\smysql_result/i or
$source_str=~m/Warning\smysql_query/i or
$source_str=~m/Warning\sarray_merge/i or
$source_str=~m/Warning\spreg_match/i or
$source_str=~m/Warning\sfilesize/i or
$source_str=~m/Warning\srequire/i or
$source_str=~m/Warning\spreg_match/i or
$source_str=~m/Warning\sinclude/i or
$source_str=~m/Warning\sinclude_once/i or
$source_str=~m/Warning\srequire_once/i or
$source_str=~m/Warning\spreg_match/i or
$source_str=~m/Warning\smain/i or
$source_str=~m/Fatal\serror/i or
$source_str=~m/Subquery\sreturns\smore\sthan/i or
$source_str=~m/Got\serror\s\'\sinvalid\srepetition\scount\(s\)\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sbraces\snot\sbalanced\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sinvalid\scharacter\sclass\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sbrackets\snot\sbalanced\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\srepetition\soperator\soperand\sinvalid\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sempty\ssub\sexpression\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sparentheses\snot\sbalanced\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sinvalid\scharacter\srange\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\sinvalid\scollating\selement\'\sfrom\sregexp/i or
$source_str=~m/Got\serror\s\'\strailing\sbackslash/i or
$source_str=~m/Duplicate\sentry/i or
$source_str=~m/Unknown\scolumn/i or
$source_str=~m/JSON_KEYS\sdoes\snot\sexist/i or
$source_str=~m/XPATH\ssyntax\serror/i){
$answer="Line from the source code of the page:\n".$source_str."\n";
$n_str=@arr_sorce_str+1;
}elsif($source_str=~m/An\sappropriate\srepresentation\sof\sthe\srequested\sresource\scould\snot\sbe\sfound/i){
$answer="WAF Works...\n";
} else {
$answer ="";
}		
}
}else{
$answer ="Source code of the page empty...\n";
}		
return $answer;	
}			
		
sub get_host_name()
{
my $str_url=shift;
if($str_url=~m/http:\/\//gi or $str_url=~m/https:\/\//gi){
my @name=split("/",$str_url);
return $name[0].';'.$name[2];	
}
}	

sub get_page() 
{
my $link=$_[0];
my $agent=$_[1];
my $prox=$_[2];

my $ua = new LWP::UserAgent(agent => rand_ua($agent));
if ($prox){$ua->proxy([qw(http https)] => $prox);}
my $response = $ua->get($link);
if($response->code==200){
	$cont=$response->decoded_content;
if($cont){return $cont;}else{ return 1;}

} elsif($response->code==404){ 
	return 2; 
	 }else{ return $response->code,' ', $response->message,"\n";}
}

sub post_get(){
	my $url=$_[0];
	my $prox=$_[1];
	my $agent=$_[2];
    my $req = HTTP::Request->new('POST', $url);
    $req->header( 'Content-Type' => 'text/html');
    my $lwp = new LWP::UserAgent(agent => rand_ua($agent));
if ($prox){$lwp->proxy([qw(http https)] => $prox);}
my $response = $lwp->request( $req );
return $response->decoded_content.'Responsesesessss:'.$response->code.'Responsesesessss:'.$response->message;
}

sub parse_jetlib(){
use locale;
my $content=$_[0];
my $companent=$_[1];
my $comp=$companent.' ';
my $compan='com_'.$companent;
my $res='';
my @item_url_name_tmp=split('<a class="tlink" href="#" onclick="',	$content);
for($ci=1;$ci<@item_url_name_tmp;$ci++){
my $item_url='';
my $item_name='';

($item_name,$item_url)=split('</a></h4>',$item_url_name_tmp[$ci]);
($tm,$item_name)=split('">',$item_name);
($item_url)=split('">',$item_url);
($tm,$item_url)=split('<a class="item_url" href="',$item_url);
$tmp_name=lc($item_name);
$comp=lc($comp);
$compan=lc($compan);

if($tmp_name=~/$comp/){
unless($res=~/$item_url/){
$res=$res.'Name: '.$item_name."\nLink:".$item_url."\n";	
}
} elsif ($tmp_name=~/$compan/){
unless($res=~/$item_url/){
$res=$res.'Name: '.$item_name."\nLink:".$item_url."\n";	
}
}		
}
if($res){
	return $res;
}	
}

sub get_key(){
system "stty", "-icanon", "min", "0";
my $key = <STDIN>;
system "stty", "icanon", "eol", "^@"; 
return ($key);
}
[\code]

P.S. comdb берите с последнего вложения, там не много больше компонентов.
 

Вложения

Error open comdb!
 

Вложения

  • Безымянный 1.jpg
    Безымянный 1.jpg
    58,6 КБ · Просмотры: 170
Код:
#!/usr/bin/perl
#-------------------------------------------
#Show Me components Joomla 
#Version: 1.2.16e beta
#Version Components DB: 0.0.3
#Description:This script touches on components on the website with Joomla engine according to the list and shows result of search.
#Author: Centr
#link: https://codeby.net/members/centr.71419/
#___________________________________________

use WWW::UserAgent::Random;
use LWP::UserAgent;
use HTTP::Request;
use HTML::Entities;
use File::Spec;
use URI::Escape; # после этого

##### меняемвсё на  вот это:
use Cwd qw(realpath);

my $cur_path =realpath($0);
$cur_path=~s/$0//g;
my ($check_ver_com);
my $f_base_com=$cur_path.'comdb';
### до вот этой строчки 
##### chomp @ARGV; ##### это уже остаётся
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!