【技術原創】Sophos UTM利用分析——清除Last WebAdmin Sessions記錄
0x00 前言
對於Sophos UTM裝置,在web管理頁面中,Last WebAdmin Sessions會記錄使用者每次登入的資訊,本文僅在技術研究的角度介紹清除指定Last WebAdmin Sessions記錄的方法,記錄研究細節。
0x01 簡介
本文將要介紹以下內容:
·研究過程
· 實現方法
0x02 Last WebAdmin Sessions簡介
在web管理頁面中,選中Management後會顯示Last WebAdmin Sessions記錄,如下圖:
記錄包括以下內容:
·User:登入使用者名稱
· Start:登入時間
· State:退出時間
· IP address:登入IP
· Changelog:修改的配置
對於Changelog,點選Show,會顯示修改的配置,如下圖
預設配置下,Last WebAdmin Sessions會顯示最近的20條記錄。
0x03 研究過程
1.嘗試修改/var/confd/var/storage/cfg
在上篇文章《Sophos UTM利用分析——匯出配置檔案》提到,/var/confd/var/storage/cfg儲存Sophos UTM的配置資訊,所以猜測通過修改/var/confd/var/storage/cfg檔案可以實現Last WebAdmin Sessions記錄的清除。
/var/confd/var/storage/cfg的檔案格式為Perl Storable files,這裡使用StorableEdit來編輯檔案。
向Sophos UTM上傳檔案storableedit-1.5.pl,執行命令:
./storableedit-1.5.pl cfg
結果如下圖:
解析出的檔案結構同使用SophosUTM_ConfigParser.py匯出的結果一致。
檢視配置資訊,命令如下:
cd lastchange cd REF_AaaGroGroup1 ls
將所有屬性置空,命令如下:
$cur->{'user'} = '',$cur->{'time'} = '',$cur->{'sid'} = '',$cur->{'srcip'} = ''
儲存檔案,命令如下:
x
然而,修改cfg檔案後不會影響Last WebAdmin Sessions記錄。
2.反編譯web管理頁面的原始碼
web管理頁面的程式檔案路徑:/var/sec/chroot-httpd/var/webadmin/webadmin.plx
使用SophosUTM_plxDecrypter.py反編譯/var/sec/chroot-httpd/var/webadmin/webadmin.plx
定位到關鍵檔案:export-webadmin.plx\wfe\asg\modules\asg_dashboard.pm
定位到關鍵內容:my $userlog = $sys->userlog_read(max => 20, facility => 'webadmin,acc-agent,acc_sso') || [];
如下圖:
從輸出結果中定位到關鍵函式:userlog_read
3.定位關鍵函式userlog_read
google搜尋$sys->userlog_read,找到一份參考文件:https://community.sophos.com/utm-firewall/astaroorg/f/asg-v8-000-beta-closed/69661/7-920-bug-open-failed-smtp-relay-login-is-showing-up-on-last-webadmin-logins
文件中有關於userlog_read的一些描述,如下圖:
從描述得出,userlog_read同cc命令存在關聯。
4.反編譯cc命令對應的程序
cc命令對應的檔案為/var/confd/confd.plx,使用SophosUTM_plxDecrypter.py反編譯/var/confd/confd.plx
5.獲得函式userlog_read細節
搜尋userlog_read相關內容,命令如下:
grep -iR "userlog_read" /home/kali/1/decrypt/Export-confd.plx
輸出結果如下圖:
從輸出結果中定位關鍵檔案:Export-confd.plx/Info/webadmin/log.pm
定位到函式定義:
sub userlog_read { my ($self, %args) = @_; $args{max} = $args{sid} ? 1 : $args{max} || 20; $args{facility} = { map {($_ => 1)} split /,/, $args{facility} } if $args{facility}; my $sessions; $sessions = _consult_db($self, \%args) unless $self->get(qw(reporting userlog_from_logs)); $sessions = _iterate_files($self, \%args) unless ref $sessions eq 'ARRAY'; foreach my $sd (@$sessions) { $sd->{state} = (-e "$config::session_dir/$sd->{sid}" ? 'active' : 'ended') if ! $sd->{state} || $sd->{state} eq 'active'; } return $sessions; }
6.函式userlog_read程式碼分析
程式碼涉及兩個操作,分別為讀取資料庫和讀取檔案,詳情如下:
(1)資料庫操作
關鍵程式碼:
sub _consult_db { my ($self, $args) = @_; my $facility_selection = ''; $facility_selection = 'WHERE facility in ('. join( ',', map { '?' } keys %{$args->{facility}} ).') ' if $args->{facility}; my %sql = ( sessions => 'SELECT sid, facility, srcip, username, time, endtime, state ' .'FROM confd_sessions '.$facility_selection .'ORDER BY time DESC LIMIT ?', session => 'SELECT sid, facility, srcip, username, time, endtime, state ' .'FROM confd_sessions WHERE sid = ?', nodes => 'SELECT * FROM confd_nodes WHERE sid = $1 ORDER BY time DESC', objects => 'SELECT * FROM confd_objects WHERE sid = $1 ORDER BY time DESC', ); # Prepare database access. my $db = Astaro::ADBS->new(dbName => 'reporting') or return; while (my ($key, $query) = each %sql) { $db->registerSQL($key, $query) or return; } # List Confd sessions. my $sessh; if ($args->{sid}) { $sessh = $db->getHandle('session') or return; $sessh->execute($args->{sid}) or return; } elsif( $args->{facility} ) { $sessh = $db->getHandle('sessions') or return; $sessh->execute(keys %{$args->{facility}}, $args->{max}) or return; } else { $sessh = $db->getHandle('sessions') or return; $sessh->execute($args->{max}) or return; } my $sessions = $sessh->fetchall_arrayref({}); my $nodeh = $db->getHandle('nodes') or return; my $objh = $db->getHandle('objects') or return; foreach my $sd (@$sessions) { # Tweak session data. $sd->{time} =~ tr/- /:-/; $sd->{endtime} =~ tr/- /:-/ if defined $sd->{endtime}; $sd->{user} = delete $sd->{username}; # user is a reserved word in SQL $sd->{user} .= ' (SUM)' if $sd->{facility} eq 'acc_sso'; $sd->{user} = utils::Sanitize::sanitize($sd->{user}) if $sd->{user}; # Fetch node changes. $nodeh->execute($sd->{sid}) or return; foreach my $node (@{ $nodeh->fetchall_arrayref({}) }) { $node->{time} =~ tr/- /:-/; $node->{node_descr} = Message::get_phrase( 'N', $node, { Nattrs => ['node'] }); $sd->{main}{$node->{node}} ||= []; push @{$sd->{main}{$node->{node}}}, $node; } # Fetch object changes. $objh->execute($sd->{sid}) or return; foreach my $object (@{ $objh->fetchall_arrayref({}) }) { my $attrs = $object->{attrs} || []; $object->{attributes} = []; while (@$attrs) { my $name = shift @$attrs; $object->{"attr_$name"} = shift @$attrs; $object->{"oldattr_$name"} = shift @$attrs; $object->{"descr_$name"} = Message::get_phrase( 'A', $object, { attr => $name }); push @{$object->{attributes}}, $name; } delete $object->{attrs}; if (@{$object->{attributes}}) { $object->{attributes} = [ sort @{$object->{attributes}} ]; } else { delete $object->{attributes}; } $object->{time} =~ tr/- /:-/; $object->{obj_descr} = Message::get_phrase('O', $object, {}); $sd->{objects}{$object->{ref}} ||= []; push @{$sd->{objects}{$object->{ref}}}, $object; } } $db->disconnect; return $sessions; }
程式碼分析:
從資料庫reporting中分別執行以下操作實現資料讀取:
sessions: SELECT sid,facility,srcip,username,time,endtime,state FROM confd_sessions; nodes: SELECT * FROM confd_nodes; objects: SELECT * FROM confd_objects;
經過測試分析,confd_sessions儲存Session資訊。
讀取Session資訊的cmd命令:
psql reporting -U postgres -c 'SELECT sid,facility,srcip,username,time,endtime,state FROM confd_sessions;'
(2)檔案操作
關鍵程式碼:
sub _iterate_files { my ($self, $args) = @_; # choose the first file to process my $filename = '/var/log/confd.log'; if (defined $args->{time}) { my @then; if ($args->{time} =~ /^(\d{4}):(\d\d):(\d\d)/) { @then = (0, 0, 12, $3, $2-1, $1-1900); } else { @then = localtime($args->{time}); } my $then = POSIX::strftime('%F', @then); my $now = POSIX::strftime('%F', localtime); $filename = POSIX::strftime( '/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz', @then, ) if $then ne $now; } # process the first file my $sessions = []; my $sdata = {}; _parse_file($self, $filename, $sessions, $sdata, $args); # if needed, process archived log files if (@$sessions < $args->{max} && not $args->{time}) { my $iter = File::Next::files({ file_filter => sub { /\.log\.gz$/ }, sort_files => \&File::Next::sort_reverse, }, '/var/log/confd'); while (@$sessions < $args->{max}) { $filename = $iter->(); last unless defined $filename; my @new_sessions; _parse_file($self, $filename, \@new_sessions, $sdata, $args); push @$sessions, @new_sessions; } } # limit the number of sessions to report on splice @$sessions, $args->{max} if @$sessions >= $args->{max}; return [ @{$sdata}{@$sessions} ]; }
程式碼分析:
讀取檔案/var/log/confd.log,/var/log/confd.log只能儲存現在時間到之前一段時間的日誌,更早時間的日誌會儲存在/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz,例如2022年5月16日的日誌對應位置為/var/log/confd/2022/05/confd-2022-05-16.log.gz
經過測試分析,/var/log/confd.log儲存Session資訊。
7.編輯檔案中儲存的Session資訊
檢視登入成功的資訊:
cat /var/log/confd.log| grep success
返回結果示例:
2022:05:23-00:19:33 test confd[41177]: I Role::authenticate:185() => id="3106" severity="info" sys="System" sub="confd" name="authentication successful" user="admin" srcip="192.168.1.2" sid="8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab" facility="webadmin" client="webadmin.plx" call="new"May 23 00:19:33 confd[41177]: D sys::AUTOLOAD:307() => id="3100" severity="debug" sys="System" sub="confd" name="external call" user="admin" srcip="192.168.1.2" facility="webadmin" client="webadmin.plx" lock="none" method="get_SID"
從結果中獲得sid為8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab
篩選出指定sid的資訊:
cat /var/log/confd.log| grep 8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab
返回結果示例:
2022:05:23-00:19:33 test confd[41177]: I Role::authenticate:185() => id="3106" severity="info" sys="System" sub="confd" name="authentication successful" user="admin" srcip="192.168.1.2" sid="8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab" facility="webadmin" client="webadmin.plx" call="new"May 23 00:19:33 confd[41177]: D sys::AUTOLOAD:307() => id="3100" severity="debug" sys="System" sub="confd" name="external call" user="admin" srcip="192.168.1.2" facility="webadmin" client="webadmin.plx" lock="none" method="get_SID" 2022:05:23-00:50:24 test confd[5198]: I Session::terminate:292() => id="3100" severity="info" sys="System" sub="confd" name="closing session" user="admin" srcip="192.168.1.2" sid="8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab" facility="webadmin" client="webadmin.plx" call="logout" function="logout"
從中提取出:
·authentication successful: 2022:05:23-00:19:33
· User: admin
· srcip: 192.168.1.2
· closing session: 2022:05:23-00:50:24
將以上資訊同Web管理頁面Management的Last WebAdmin Sessions進行比對,發現數據保持一致。
刪除以上資訊:
sed -i "/8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab/d" /var/log/confd.log
重新整理Web管理頁面Management,發現該方法無法清除Last WebAdmin Sessions記錄。
8.編輯資料庫中儲存的Session資訊
查詢指定sid的資訊:
psql reporting -U postgres -c "SELECT sid,facility,srcip,username,time,endtime,state FROM confd_sessions WHERE sid ='8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab';"
刪除指定sid的資訊:
psql reporting -U postgres -c "DELETE FROM confd_sessions WHERE sid ='f7cce7739e98229816be6b186ada2e2942064cbf0093e329e98939fe65d8d3e3';"
重新整理Web管理頁面Management,發現該方法能夠清除Last WebAdmin Sessions記錄(包括Changelog)。
0x04 實現方法
綜合以上內容,得出清除Last WebAdmin Sessions記錄的方法:清除資料庫reporting中對應的記錄。
具體方法如下:
1.確認Last WebAdmin Sessions記錄對應的sid
讀取檔案/var/log/confd.log,查詢命令:
cat /var/log/confd.log| grep success
從返回結果中確認Session記錄的sid
2.刪除sid對應的Session記錄
命令示例:
psql reporting -U postgres -c "DELETE FROM confd_sessions WHERE sid ='f7cce7739e98229816be6b186ada2e2942064cbf0093e329e98939fe65d8d3e3';"
0x05 小結
本文介紹了清除Last WebAdmin Sessions記錄的細節。
- Longhorn 的正確使用姿勢:如何處理增量 replica 與其中的 snapshot/backup
- 奇安信連續四年登榜“北京民營企業百強”
- “三重提升”保護資料安全 揭祕南陽二院資料互動安全之路
- 瀏覽器擴充套件 比你想象得更危險
- Lilith僵屍網路及其背後的Jester黑客團伙跟進分析
- 提升公眾反詐意識 共築堅實防線:騰訊“反詐在行動”助力全民反詐
- 【技術原創】滲透技巧——從VMware ESXI橫向移動到Windows虛擬機器
- 保護物聯網裝置遠離網路攻擊的五個步驟
- MICROSOFT WINDOWS NFS V4中發現一個遠端程式碼執行漏洞
- TP-Link TL-WR841N 裝置上的漏洞(CVE-2022-30024)分析
- CopperStealer傳播基於惡意Chromium的瀏覽器擴充套件來竊取加密貨幣
- Snatch,BianLian 和 Agenda都出現了最新的變體
- KCon 2022 演講 PPT 新鮮出爐!
- VMware Tools本地提權漏洞CVE-2022-31676分析與復現(1)
- 通過自治系統號(ASN)預判攻擊發生的可能性
- ZecOps 對 AliExpress 平臺購買的 Android 手機取證分析,發現該手機將系統 Android 6 偽造欺騙成...
- 盤古石手機取證分析系統入選首屆法律科技成果案例
- 如何在當今不斷變化的威脅環境中,實現漏洞管理的現代化
- 360揭祕美國網路攻擊西工大細節 攻克“看見”高階攻擊世界性難題
- 【安全熱點】從暢捷通漏洞利用事件看勒索病毒如何防治