Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
B

êsn t‹\mã@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddlm
Z
mZmZddlmZddlmZmZmZdd	lmZdd
lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%ddl&m'Z'm(Z(m)Z)m*Z*m+Z+Gdd
„d
e,ƒZ-dS)z[
profiler.profiler
~~~~~~~~~~~~~~~~~

profiler code goes here, separate from fake ap code.
éN)ÚDiffer)Ústrftime)ÚDictÚListÚTuple)Úmanuf)ÚDot11ÚRadioTapÚwrpcapé)Ú__version__)Ú_20MHZ_CHANNEL_LISTÚEXT_CAPABILITIES_IE_TAGÚFT_CAPABILITIES_IE_TAGÚHE_6_GHZ_BAND_CAP_IE_EXT_TAGÚHE_CAPABILITIES_IE_EXT_TAGÚHE_SPATIAL_REUSE_IE_EXT_TAGÚHT_CAPABILITIES_IE_TAGÚ
IE_EXT_TAGÚPOWER_MIN_MAX_IE_TAGÚRM_CAPABILITIES_IE_TAGÚRSN_CAPABILITIES_IE_TAGÚSSID_PARAMETER_SET_IE_TAGÚSUPPORTED_CHANNELS_IE_TAGÚVENDOR_SPECIFIC_IE_TAGÚVHT_CAPABILITIES_IE_TAG)Ú
Base64EncoderÚ
CapabilityÚflag_last_objectÚget_bitÚ
is_randomizedc
@s\eZdZdZd/dd„Zddœdd„Zddœdd	„Zeee	ee
eeeed
œdd„ƒZed
œdd„Z
eeedœdd„ƒZeedœdd„Zeedœdd„ƒZeedœdd„ƒZeedœdd„ƒZeedœdd„ƒZeeedœdd „ƒZeedœd!d"„ƒZeedœd#d$„ƒZeedœd%d&„ƒZeeed'œd(d)„ƒZeeed*œd+d,„ƒZeeeee	fd'œd-d.„ZdS)0ÚProfilerz,Code handling analysis of client capablitiesNcCsLt t ¡dd d¡d¡|_t ¡|_|j 	dt 
¡|j¡i|_||_|r| 
d¡ 
d¡}|rtt|ƒ|_n|j d¡| 
d¡ 
d	¡|_| 
d¡ 
d
¡|_| 
d¡ 
d¡|_| 
d¡ 
d¡|_| 
d¡ 
d
¡|_tj |jd¡|_tj |jd¡|_tj |jdt d¡›d¡|_d|_tjdd|_ d|_!d|_"| #|¡dS)Nrrú/éÿÿÿÿz profiler pid: %s; parent pid: %sZGENERALÚchannelz-profiler cannot determine channel from configÚlisten_onlyÚ
files_pathÚ
pcap_analysisÚft_disabledÚhe_disabledZreportsZclientsz	profiler-z%Y-%m-%dz.csvF)ÚupdatezN/AT)$ÚloggingÚ	getLoggerÚinspectÚstackÚsplitÚlogÚosÚgetppidZ
parent_pidÚdebugÚgetpidÚ
analyzed_hashÚconfigÚgetÚintr$Úwarningr%r&r'r(r)ÚpathÚjoinZreports_dirÚclients_dirÚtimerÚcsv_fileÚclient_profiled_countrZ	MacParserÚlookupÚ
last_manufÚrunningÚrun)Úselfr6Úqueuer$©rFú“/build/wlanpi-profiler-CSvHZ8/wlanpi-profiler-1.0.7~rc2/debian/wlanpi-profiler/opt/wlanpi-profiler/lib/python3.7/site-packages/profiler/profiler.pyÚ__init__1s0"
zProfiler.__init__)ÚreturncCsÌ|rÈi}d}xº|jrÆ| ¡}|ršt|tƒs4t|tƒrš|j|kr‚t ¡||j}||krr|j d|j|d›¡qqt ¡||j<nt ¡||j<| 	|¡| 
¡r|jr|j d|j¡t
 tj¡qWdS)zFRunner which performs checks prior to profiling an association requestéz?already seen %s %s seconds ago; not sending to profiler processz.2fz,exit because we were told to only analyze %sN)rBr7Ú
isinstancer	rÚaddr2r=r0r3ÚprofileÚemptyr'ÚinfoÚsysÚexitÚsignalÚSIGTERM)rDrEÚbufferZbuffer_squelchÚframeZtocrFrFrGrCOs0


zProfiler.runc
Csˆ|j}t|}d}|dkr(|dkr(d}n4|dkr>|dkr>d}n|dkrX|dkrXd	}d
}nd}| ||¡\}}}t|j›d|›ƒ}	|	|j ¡kr¤|j d
|j|	¡nàt	|jƒ}
|}|
rÎ|dkrÄd}n
d 
|¡}||_||j|	<|jrö|j d|j|¡| 
|||j||||j¡}|j d|j|¡|j d|j|	tj |j|j dd¡¡¡| |||||
|||j¡|jd7_|j d|j¡dS)z4Handle profiling clients as they come into the queueFik	iµ	z2.4GHziìiz5.8GHziÐz6.0GHzTÚunknownz: z@already seen %s (capabilities hash=%s) this session, ignoring...NzRandomized MACz{0} (Randomized MAC)z+discovered association request for %s to %sz generating text report for %s
%sz;writing textual reports for %s (capabilities hash=%s) to %sú:ú-rz %s clients profiled this session)ZChannelFrequencyr
Úanalyze_assoc_reqÚhashrLr5Úkeysr0rOr ÚformatrAr%Úgenerate_text_reportr3r1r:r;r<ÚreplaceÚwrite_analysis_to_file_systemr?)
rDrUÚfreqr$Úis_6ghzÚbandÚssidÚ	oui_manufÚcapabilitiesZ
analysis_hashÚ
randomizedZtext_report_oui_manufÚtext_reportrFrFrGrMssr


zProfiler.profile)rdreÚ
client_macr$rbrcr%rIcCsüd}|r|d|›7}|d|›7}|d|p.d›7}d}|ddkrLd	}n(|dd
kr^d}n|ddkrpd
}nd}|d|›7}|d|›d7}|d7}|d7}x<|D]4}	|	jr¨|	jr¨d |	j|	j¡}
|
 ¡r¨||
d7}q¨W|d7}|d7}|d7}|S)zGenerate a report for outputz----------------------------------------------z

 - SSID: z
 - Client MAC: z
 - OUI manufacturer lookup: ÚUnknownÚrÚ2z2.4 GHzÚ5z5 GHzÚ6z6 GHzz
 - Frequency band: z
 - Capture channel: Ú
z{0:<20} {1:<20}z(
Key: [X]: Supported, [ ]: Not supportedzf
* Reported client capabilities are dependent on available features at the time of client association.zj
** Reported channels do not factor local regulatory domain. Detected channel sets are assumed contiguous.)ÚnameÚvaluer\Ústrip)rdrerhr$rbrcr%rgZ
band_labelÚ
capabilityÚoutrFrFrGr]Âs4
zProfiler.generate_text_report)rfc	!	Cst t ¡dd¡}	|j ddd¡}
tj |j	|
¡}tj 
|¡s~yt |¡Wn,tk
r||	 
d|¡t tj¡YnXi}|
|d<||d<||d	<|dd
kr¬d}
n(|ddkr¾d}
n|dd
krÐd}
nd}
|
|d<||d<||d<i}x|D]}|jrö|j||j<qöW||d<tjt|ƒtd|d<d|d<t|d<tj ||
›d|›d¡}tj ||
›d|›d¡}y\d}tdƒ}tj |¡rút|dƒ}t |¡}WdQRXttt | d¡¡ƒƒttt |¡ƒƒkràd}|sú| dd |›d¡}t|d!ƒ}t  ||¡WdQRXtj |¡r®t|dƒ8}| !¡}g}x |D]}| "| d"d#¡¡qHW|}WdQRX|s®t#t$ƒ %|| &d"¡¡ƒ}| dd |›d¡}d" |¡}t|d!ƒ}| '|¡WdQRXWn.tk
rþ|	 
d$|¡t tj¡YnX|
|d%œ}d&d'g}x"|D]}|jr|j||j<qWx>|D]6}|jdk	r<|jdk	r<| "|j¡|j||j<q<Wtj (|¡dd(}t)||gƒtj |j*¡sÖt|j*d!d)}t+j,||d*} |  -¡WdQRXt|j*d+d)}t+j,||d*} |  .|¡WdQRXdS),z4Write report files out to a directory on the WLAN PirrJrWrXézproblem creating %s directoryÚmacZis_laarrkérlrmérbZcapture_channelr%Úfeatures)ÚclsZpcaprZschema_versionZprofiler_versionÚ_z.txtz.jsonFz
%Y%m%dt%H%M%SÚrNTz_diff.Úwrnrjz2error creating flat files to dump client info (%s))Ú
Client_MacÚ	OUI_Manufr}r~z.pcap)Úmode)Ú
fieldnamesÚa)/r+r,r-r.rLr^r1r:r;r<ÚisdirÚmkdirÚOSErrorÚ	exceptionrPrQrRÚSIGHUPÚdb_keyÚdb_valueÚjsonÚdumpsÚbytesrrrÚexistsÚopenÚloadrZÚstrr7ÚdumpÚ	readlinesÚappendÚlistrÚcomparer/ÚwriteÚsplitextr
r>ÚcsvÚ
DictWriterÚwriteheaderÚwriterow)!rDrgrerUrdrfrbr$r%r0rhÚdestÚdataZband_dbrxrrZ
text_filenameZ
json_filenameZsameZ
write_timeÚ_fileZ
existing_jsonZwrite_json_fileÚ	read_fileZ
existing_textÚtempÚlineZfile_writerZout_rowZout_fieldnamesZ
pcap_filenameZfile_objZ
csv_writerrFrFrGr_ës¨





z&Profiler.write_analysis_to_file_system)rTrIc
Csi}d}d}g}d}d}d}xât|ƒD]Ö\}}	|r<|}d}q&|rJ|}d}q&||krf|d7}| |¡nZ|ttgkr–||krŠ|| |¡qž|g||<n|||<d}d}d}g}d}d}|}d}q&|	r&|ttgkrô||krè|| |¡qü|g||<q&|||<q&W|S)z¨
        Parse a 802.11 payload and returns a dict of IEs

        Does not handle headers or FCS.

        You must strip those before passing the payload in.
        rTFr)rr’rr)
rTZinformation_elementsZ
element_idZelement_lengthÚelement_dataZ
is_index_byteZis_length_byteÚindexÚbyteÚlastrFrFrGÚprocess_information_elementsmsP
z%Profiler.process_information_elements)rurIcCsÚt t ¡dd¡}|j |¡}d}ddddœ}|dksH| ¡ |¡rÈt| 	¡krÈxr|tD]f}d 
|d|d	|d
¡}|j |¡}	|	dk	r^d}
|	 ¡ |
¡r^|	 ¡|krÀ| |	 ¡|	¡}q^|	}q^W| d||¡|S)
z@Resolve client's manuf using manuf database and other heuristicsrrJZmuratamaZIntelZSamsung)ZintelwirZintelcorZsamsungeNz {0:02X}:{1:02X}:{2:02X}:00:00:00rrv)ZappleZsamsungÚintelzfinished oui lookup for %s: %s)
r+r,r-r.r@Z	get_manufÚlowerÚ
startswithrr[r\r7r3)rDruÚdot11_elt_dictr0rdZlow_qualityÚsanitizer¡Z
vendor_macZoui_manuf_vendorÚmatchesrFrFrGÚresolve_oui_manuf®s&zProfiler.resolve_oui_manufcCsXd}t| ¡krTyt|tƒ d¡}Wn&tk
rLt|tƒ d¡}YnX|›}|S)z2Check the SSID parameter to determine network namerjzutf-8zlatin-1)rr[r‹ÚdecodeÚUnicodeDecodeError)r©rsrcrFrFrGÚanalyze_ssid_ieÔszProfiler.analyze_ssid_iecCs~tddddd}tddd}t| ¡krvd}x.tdd	ƒD] }|t|}|d
@r8|d7}q8Wd|›d
|_d|_||_||gS)zCheck for 802.11n supportz802.11nz
Not reported*Údot11nr)rorpr‡rˆÚ
dot11n_nss)r‡rˆrJééÿrzSupported (zss))rrr[Úrangerprˆ)r©r°r±Zspatial_streamsZ	mcs_octetZmcs_octet_valuerFrFrGÚanalyze_ht_capabilities_ieâsz#Profiler.analyze_ht_capabilities_iecCsBtddddd}tddd}tdd	d}td
dd}tddd}tddd}t| ¡kr2|td
}|td}d}	g}
x¸||gD]¬}x¦dD]ž}t||ƒ}
t||dƒ}|
dkr¼|dkr¼qŽ|
dkrà|dkrà|	d7}	|
 d¡qŽ|
dkr|dkr|	d7}	|
 d¡qŽ|
dkrŽ|dkrŽ|	d7}	|
 d¡qŽqŽWq„Wtt|
ƒƒ}
t|
ƒdkrXd |
¡n|
d}d|	›d|›|_	|	|_
||_
|td}|td}|td}t|dƒrÄd|_
|j	d7_	n|j	d7_	d}||@rö|j	d7_	d|_
n|j	d7_	||@r$|j	d7_	d|_
n|j	d7_	||||||gS)zCheck for 802.11ac supportz802.11acz
Not reported*Údot11acr)rorpr‡rˆÚdot11ac_nss)r‡rˆÚdot11ac_mcsrjÚ
dot11ac_su_bfÚ
dot11ac_mu_bfÚdot11ac_160_mhzrté)rrvr¼rwrz0-7z0-8z0-9z, zSupported (z	ss), MCS rvz
, [X] 160 MHzz
, [ ] 160 MHzéz, [X] SU BFz, [ ] SU BFz, [X] MU BFz, [ ] MU BF)rrr[rr’ÚsortedÚsetÚlenr;rprˆ)r©r¶r·r¸r¹rºr»Úmcs_upper_octetÚmcs_lower_octetÚnssÚmcsÚoctetÚbit_positionÚbit1Úbit2Zmcs_listZmu_octetZsu_octetZonesixtyZbeam_form_maskrFrFrGÚanalyze_vht_capabilities_ieüsr





 

z$Profiler.analyze_vht_capabilities_iecCs.tddddd}t| ¡kr(d|_d|_|gS)zCheck for 802.11k supportz802.11kz?Not reported* - treat with caution, many clients lie about thisÚdot11kr)rorpr‡rˆÚ	Supportedr)rrr[rprˆ)r©rÊrFrFrGÚanalyze_rm_capabilities_ieMsz#Profiler.analyze_rm_capabilities_ie)r(rIcCs<tddddd}|rd|_nt| ¡kr6d|_d|_n|gS)	zCheck for 802.11r supportz802.11rz
Not reported*Údot11rr)rorpr‡rˆz(Reporting disabled (--no11r option used)rËr)rrprr[rˆ)r©r(rÍrFrFrGÚanalyze_ft_capabilities_ie\sz#Profiler.analyze_ft_capabilities_iecCs\tddddd}t| ¡krV|t}dt|ƒkrV|d}tddƒ}||@rVd	|_d
|_|gS)zCheck for 802.11v supportz802.11vz
Not reported*Údot11vr)rorpr‡rˆrJrvZ00001000rËr)rrr[rÀr8rprˆ)r©rÏZext_cap_listZoctet3Zbss_trans_supportrFrFrGÚanalyze_ext_capabilities_iels
z$Profiler.analyze_ext_capabilities_iecCsRtddddd}t| ¡krL|t}t|ƒd}||}d|krLd|_d	|_|gS)
zCheck for 802.11w supportz802.11wzNot reportedÚdot11wr)rorpr‡rˆrvérËr)rrr[rÀrprˆ)r©rÑZrsn_cap_listZrsn_lenZpmf_octrFrFrGÚanalyze_rsn_capabilities_ie…sz$Profiler.analyze_rsn_capabilities_iecCs†tddddd}tddd}t| ¡kr~|td}|td}|d	krVd
|d}n|}|›d|_||_|›d|_||_||gS)
z&Check for supported power capabilitiesz	Max PowerzNot reportedÚ	max_powerr)rorpr‡rˆÚ	min_power)r‡rˆrrÒér#z dBm)rrr[rprˆ)r©Z
max_power_capZ
min_power_caprÔrÕZsigned_min_powerrFrFrGÚanalyze_power_capability_ie™s&z$Profiler.analyze_power_capability_ie)rarIcCsštdddgd}tddd}t| ¡kr’|t}g}d}d}xp|r®| d¡}| d¡}	|d	ksd|rr|sld
}d}
nd
}d}
|j|	7_x"t|	ƒD]}| |||
¡q’Wq@Wg}g}
xt|ƒD]„\}}|dkrÞ|
 |¡qÂ|rø|rø|d
krôd}
nd}
||
d|
kr.|
 |¡||dkrF| |
¡qÂ| |
¡g}
|
 |¡qÂWg}x*|D]"}| |d›d|d›¡qTWd |¡›d|_||_	||gS)zCheck supported channelszSupported ChannelszNot reportedÚsupported_channels)rorpr‡rˆzNumber of Channelsr)rorpFéTr¼rér#rXz, z**)
rrr[Úpoprpr´r’Ú	enumerater;rˆ)r©rarØZnumber_of_supported_channelsZchannel_sets_listZchannel_listZis_2ghzZis_5ghzZ
start_channelZ
channel_rangeZchannel_multiplierÚiÚrangesÚplaceholderr¢r$Zchannel_rangesZ_rangerFrFrGÚanalyze_supported_channels_ie¼s`





"z&Profiler.analyze_supported_channels_ie)r)rIc.CsÆtddddd}tddd}tddd}td	dd}td
dd}tddd}tdd
d}tddd}	tddd}
tddd}tddd}tddd}
tddd}|r®d|_nüt| ¡krªxê|tD]Ü}tt|dƒƒ}|tkrˆd|_d|_|d}|d}d}g}xÐ||gD]Ä}x¼dD]´}t||ƒ}t||dƒ}|dkrT|dkrTq |dkr~|dkr~|d7}| 	d¡q |dkr¨|dkr¨|d7}| 	d¡q |dkr |dkr |d7}| 	d¡q q WqWt
t|ƒƒ}t|ƒdkrd 
|¡n|d}d|›d|›|_||_||_|d }t|d!ƒrR|jd"7_d|_n|jd#7_|d}t|dƒrŠd|	_|jd$7_n|jd%7_|d&}d
}x&td&ƒD]}|tt||ƒƒ›7}q®Wd'd(„|dd)…Dƒ}t|ƒ}|rd|_|jd*7_nd|_|jd+7_|d,}d
} x&td&ƒD]}| tt||ƒƒ›7} q0Wt| d ƒrbd-}!nd.}!|!r‚d|_|jd/7_nd|_|jd07_|d1}"d
}#x&td&ƒD]}|#tt|"|ƒƒ›7}#q¬Wt|#dƒrÞd-}$nd.}$|$rþd|_|jd27_nd|_|jd37_|d4}%d
}&x&td&ƒD]}|&tt|%|ƒƒ›7}&q(Wt|&dƒrZd-}'nd.}'|'rzd|_|jd57_nd|_|jd67_|d)}(d
})x&td&ƒD]}|)tt|(|ƒƒ›7})q¤Wt|)d7ƒrÖd-}*nd.}*|*röd|
_|jd87_nd|
_|jd97_|d!}+d
},x&td&ƒD]}|,tt|+|ƒƒ›7},q Wt|,d!ƒrRd-}-nd.}-|-rrd|_|jd:7_qÈd|_|jd;7_qÈ|tkr˜d|
_|tkrÈd|_qÈW||||	|
|||||||gS)<zCheck for 802.11ax supportz802.11axz
Not supportedÚdot11axr)rorpr‡rˆÚdot11ax_six_ghz)r‡rˆÚdot11ax_punctured_preambleÚdot11ax_he_su_beamformerÚdot11ax_he_su_beamformeeÚdot11ax_nssÚdot11ax_mcsrjÚdot11ax_twtÚdot11ax_uoraÚdot11ax_bsrÚdot11ax_he_er_su_ppduÚdot11ax_spatial_reuseÚdot11ax_160_mhzz)Reporting disabled (--no11ax option used)rËréé)rrvr¼rwz0-7z0-9z0-11z, zSupported (z	ss), MCS r²rJz
, [X] 160 MHzz
, [ ] 160 MHzz	, [X] TWTz	, [ ] TWTécSsg|]}tt|ƒƒ‘qSrF)Úboolr8)Ú.0ÚbitrFrFrGú
<listcomp>\sz2Profiler.analyze_extension_ies.<locals>.<listcomp>r¼z, [X] Punctured Preamblez, [ ] Punctured Preambleé
TFz, [X] SU Beamformerz, [ ] SU Beamformeréz, [X] SU Beamformeez, [ ] SU BeamformeerÚz, [X] HE ER SU PPDUz, [ ] HE ER SU PPDUrvz
, [X] UORAz
, [ ] UORAz	, [X] BSRz	, [ ] BSR)rrprr[r8rrrˆrr’r¾r¿rÀr;r´Úanyrr).r©r)rárârãrärårærçrèrérêrërìrír¡Z	ext_ie_idrÁrÂrÃrÄrÅrÆrÇrÈZonesixty_octetZ	twt_octetZpunctured_preamble_octetZ&punctured_preamble_octet_binary_stringZpunctured_bit_booleansZpuncture_preamble_supportZsu_beamformer_octetZ!su_beamformer_octet_binary_stringZsu_beamformer_supportZsu_beamformee_octetZ!su_beamformee_octet_binary_stringZsu_beamformee_supportZhe_er_su_ppdu_octetZ!he_er_su_ppdu_octet_binary_stringZhe_er_su_ppdu_supportZ
uora_octetZuora_octet_binary_stringZuora_supportZ	bsr_octetZbsr_octet_binary_stringZbsr_supportrFrFrGÚanalyze_extension_iesÿsB









 

zProfiler.analyze_extension_iesc	Cst t ¡dd¡}t|jƒ}|dd…}|dd…}|dd…}| |¡}| dt|ƒ|j	| 
¡¡| |j	|¡}| |¡}g}|| 
|¡7}|| ||j¡7}|| |¡7}|| |¡7}|| |¡7}|| |¡7}|| ||j¡7}|| |¡7}|| ||¡7}|||fS)z/Tear apart the association request for analysisrrJéNr¼éüÿÿÿz(%s IEs detected in assoc req from %s: %s)r+r,r-r.r‹Úpayloadr¥r3rÀrLr[r¬r¯rÌrÎr(rÐrÓrµrÉrør)r×rà)	rDrUrar0Z	ie_bufferr©rdrcrerFrFrGrYÖs2



zProfiler.analyze_assoc_req)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rHrCrMÚstaticmethodrr“r8rñr]r_r‹Údictr¥r¬r¯rrµrÉrÌrÎrÐrÓr×ràrørrYrFrFrFrGr!.sN
$O&|@&
P"BWr!).rÿr—r-r‰r+r1rRrPr=ÚdifflibrrÚtypingrrrrZ	scapy.allrr	r
rÚ	constantsr
rrrrrrrrrrrrrrZhelpersrrrrr Úobjectr!rFrFrFrGÚ<module>
s"D